您的位置:首页 > 其它

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

2013-04-03 16:19 141 查看
搜狐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

迭代:

LinkNode *reverse_link_my(LinkNode *head)
{
LinkNode *p, *nh, *q;

if (!head)
{
return NULL;
}
p = head;
nh = p->next;
if (!nh)
{
return p;
}
q = nh->next;
p->next = NULL;

while(q)
{
nh->next = p;
p = nh;
nh = q;
q = q->next;
}
nh->next = p;

return nh;

}


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

// 返回新链表头节点
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;
}


递归:

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

LinkNode *reverse_link_recursive_my(LinkNode *head)//返回逆链表的最后一个元素
{
if (!head)
{
rh = NULL; //save the reverse link head(new) rh全局保存新的头结点,挫计...
return NULL;
}
if (head->next == NULL)
{
rh = head;////save the reverse link head(new)
return head;
}

LinkNode *nt;

nt = reverse_link_recursive_my(head->next);
nt->next = head;
head->next = NULL;

return head;
}


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

LinkNode *reverse_link_recursive(LinkNode *head)
{
if(head == NULL)
return NULL;
LinkNode *curr , *reverse_head , *temp;
if(head->next == NULL)    // 链表中只有一个节点,逆转后的头指针不变
return head;
else
{
curr = head;
temp = head->next;    // temp为(a2,...an)的头指针
reverse_head = reverse_link_recursive(temp);   // 逆转链表(a2,...an),并返回逆转后的头指针
temp->next = curr;    // 将a1链接在a2之后
curr->next = NULL;
}
return reverse_head;      // (a2,...an)逆转链表的头指针即为(a1,a2,...an)逆转链表的头指针
}


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

看了积累还不够啊~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: