您的位置:首页 > 其它

单链表的逆序

2009-12-24 09:39 218 查看
今天看面试题目系列二时,碰到了这么一个题目。刚开始的想了下,以为会跟字符串逆转类似,所以动手写ReverseList的时候就把它当成字符串逆转处理了。完了后发现是根本不能这么处理,因为字符串指向最后字符的指针pend可以通过pend--来往前进行访问,但是单链表最后的结点却不能这样向前访问,所以这个想法错误了!!!

后面看了下答案,才知道可以通过指针的操作完成,十分惭愧!!!所以决定记下来,而且这段时间很忙,博客都没更新过了……

正确方法是定义三个指针,p1 = head;p2 = p1->next;p3 = p2->next;而后令p1->next = NULL,因为逆转后原来的head结点称为最后一个结点了,再循环判断,条件是p3 != NULL;如果条件满足,可将p2指向p1:p2->next = p1;然后p1,p2,p3分别前移一个结点……如此循环,直到p3 = NULL;循环终止,但这时候p1和p2的结点没有逆序所以再将p2->next = p1;到这为止则完成整个单链表的逆序了。

源代码如下:

#include <stdio.h>
#include <malloc.h>

struct Node{
int data;
Node *next;
};

typedef struct Node Node;

Node *ReverseList(Node *head)
{
if(head == NULL || head->next == NULL)
return head;
Node *p1 = head;
Node *p2 = p1->next;
Node *p3 = p2->next;

p1->next = NULL;
while(p3 != NULL)
{
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p2->next = p1;
head = p2;
return head;
}

int main()
{
Node *head = NULL;
Node *node1 = NULL,*node2 = NULL,*node3 = NULL,*node4 = NULL;
head = (Node *)malloc(sizeof(Node));
node1 = (Node *)malloc(sizeof(Node));
node2 = (Node *)malloc(sizeof(Node));
node3 = (Node *)malloc(sizeof(Node));
node4 = (Node *)malloc(sizeof(Node));

node1->data = 1;
node2->data = 2;
node3->data = 3;
node4->data = 4;
head->next = node1;
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = NULL;

Node *ptr;
ptr = ReverseList(head);
while(ptr->next != NULL)
{
printf("%d ",ptr->data);
ptr = ptr->next;
}
printf("/n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: