反转一个单链表,迭代和递归实现

搜狐2012.9.15校园招聘会笔试题

编程题:
写代码,反转一个单链表,分别以迭代和递归的形式来实现

typedef struct node LinkNode;  
struct node  
{  
    int data;  
    LinkNode* next;  
};  

// 返回新链表头节点

LinkNode *reverse_link(LinkNode *head)
LinkNode *reverse_link_recursive(LinkNode *head)

真不难简单,可有些细节的东西就是不会处理。。。。⊙﹏⊙b

迭代:

 1 LinkNode *reverse_link_my(LinkNode *head)
 2 {
 3     LinkNode *p, *nh, *q;
 4 
 5     if (!head)
 6     {
 7         return NULL;
 8     }
 9     p = head;
10     nh = p->next;
11     if (!nh)
12     {
13         return p;
14     }
15     q = nh->next;
16     p->next = NULL;
17 
18     while(q)
19     {
20         nh->next = p;
21         p = nh;
22         nh = q;
23         q = q->next;
24     }
25     nh->next = p;
26 
27     return nh;
28 
29 }

虽然没有问题的,可是对一些临界条件处理就不如别如此优雅:

// 返回新链表头节点
LinkNode *reverse_link(LinkNode *head)
{
    if(head == NULL)
        return NULL;
    LinkNode *prev , *curr , *reverse_head , *temp;
    prev = NULL , curr = head;
    while(curr->next)
    {
        temp = curr->next;
        curr->next = prev;
        prev = curr;
        curr = temp;
    }
    curr->next = prev;
    reverse_head = curr;
    return reverse_head;
}

递归:

就是没有想出怎么处理返回的新头结点的同时也逆转链表;因为有答案懒得多想~干脆全局变量,当然这样就不满足原题目的要求了,%>_<%

 1 LinkNode *reverse_link_recursive_my(LinkNode *head)//返回逆链表的最后一个元素
 2 {
 3     if (!head)
 4     {
 5         rh = NULL; //save the reverse link head(new) rh全局保存新的头结点,挫计...
 6         return NULL;
 7     }
 8     if (head->next == NULL)
 9     {
10         rh = head;////save the reverse link head(new)
11         return head;
12     }
13 
14     LinkNode *nt;
15 
16     nt = reverse_link_recursive_my(head->next);
17     nt->next = head;
18     head->next = NULL;
19 
20     return head;
21 }

答案又是如此优雅的解决此问题:

 1 LinkNode *reverse_link_recursive(LinkNode *head)
 2 {
 3     if(head == NULL)
 4         return NULL;
 5     LinkNode *curr , *reverse_head , *temp;
 6     if(head->next == NULL)    // 链表中只有一个节点,逆转后的头指针不变
 7         return head;
 8     else
 9     {
10         curr = head;
11         temp = head->next;    // temp为(a2,...an)的头指针
12         reverse_head = reverse_link_recursive(temp);   // 逆转链表(a2,...an),并返回逆转后的头指针
13         temp->next = curr;    // 将a1链接在a2之后
14         curr->next = NULL;
15     }
16     return reverse_head;      // (a2,...an)逆转链表的头指针即为(a1,a2,...an)逆转链表的头指针
17 }

思想就是通过每次递归中增加一个变量(temp)保存新的逆链表的尾部,返回就可以直接返回最后遇到的元素的结点;巧~

看了积累还不够啊~

posted @ 2013-04-03 16:19  legendmaner  阅读(280)  评论(0编辑  收藏  举报