单链表的逆序
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;到这为止则完成整个单链表的逆序了。
源代码如下:
后面看了下答案,才知道可以通过指针的操作完成,十分惭愧!!!所以决定记下来,而且这段时间很忙,博客都没更新过了……
正确方法是定义三个指针,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; }
相关文章推荐
- [C++]练习使用链表逆序存储的两个数相加
- 【链表】逆序输出单链表(单链表反转)
- 链表逆序、判断是否有环、求环的起点;两个链表是否相交、交点
- 基本算法—链表逆序
- C语言单链表逆序
- 数据结构实验之链表二:逆序建立链表
- 数据结构实验之链表二:逆序建立链表
- 逆序输出链表
- 单链表逆序
- leetcode——Reverse Linked List II 选择链表中部分节点逆序(AC)
- 单链表的逆序
- Java 单链表逆序
- 数据结构实验之链表二:逆序建立链表
- 数据结构实验之链表二:逆序建立链表
- 单链表逆序
- 链表逆序
- 逆序输出链表
- 链表逆序
- 数据结构实验之链表二:逆序建立链表
- 将链表逆序(Revert)的C#实现