链表反转

链表的反转是常见的面试题目。本文总结了2种方法。

1 定义

单链表node的数据结构定义如下:

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
        next = null;
    }
}

2 方法1:就地反转法

2.1 思路

把当前链表的下一个节点pCur插入到头结点dummy的下一个节点中,就地反转。

dummy->1->2->3->4->5的就地反转过程:

dummy->2->1->3->4->5
dummy->3->2->1->4->5
dummy->4>-3->2->1->5
dummy->5->4->3->2->1

2.2 解释

1初始状态

2 过程

pCur是需要反转的节点。

  1. prev连接下一次需要反转的节点
  2. 反转节点pCur
  3. 纠正头结点dummy的指向
  4. pCur指向下一次要反转的节点

伪代码

1 prev.next = pCur.next;
2 pCur.next = dummy.next;
3 dummy.next = pCur;
4 pCur = prev.next;

3 循环条件

pCur is not null

2.3 代码

 1     // 1.就地反转法
 2     public ListNode reverseList1(ListNode head) {
 3         if (head == null)
 4             return head;
 5         ListNode dummy = new ListNode(-1);
 6         dummy.next = head;
 7         ListNode prev = dummy.next;
 8         ListNode pCur = prev.next;
 9         while (pCur != null) {
10             prev.next = pCur.next;
11             pCur.next = dummy.next;
12             dummy.next = pCur;
13             pCur = prev.next;
14         }
15         return dummy.next;
16     }

2.4 总结

  • 1个头结点,2个指针,4行代码
  • 注意初始状态和结束状态,体会中间的图解过程。

 

3 方法2:新建链表,头节点插入法

3.1 思路

新建一个头结点,遍历原链表,把每个节点用头结点插入到新建链表中。最后,新建的链表就是反转后的链表。

3.2 解释

1 初始状态

2 过程

pCur是要插入到新链表的节点。

pNex是临时保存的pCur的next。

  1. pNex保存下一次要插入的节点
  2. 把pCur插入到dummy中
  3. 纠正头结点dummy的指向
  4. pCur指向下一次要插入的节点

伪代码

1 pNex = pCur.next
2 pCur.next = dummy.next
3 dummy.next = pCur
4 pCur = pNex


 

3 循环条件

pCur is not null

3.3 代码

 1     // 2.新建链表,头节点插入法
 2     public ListNode reverseList2(ListNode head) {
 3         ListNode dummy = new ListNode(-1);
 4         ListNode pCur = head;
 5         while (pCur != null) {
 6             ListNode pNex = pCur.next;
 7             pCur.next = dummy.next;
 8             dummy.next = pCur;
 9             pCur = pNex;
10         }
11         return dummy.next;
12     }

3.4 总结

  • 1个头结点,2个指针(包含一个临时保存节点的pNex),4行代码
  • 注意初始状态和结束状态,体会中间的图解过程。

原文链接:[http://wely.iteye.com/blog/2363173]

时间: 2024-10-28 17:28:45

链表反转的相关文章

数据结构的C++实现之线性表之链式存储结构以及单链表反转

为了表示每个数据元素ai与其直接后继元素ai+1之间的逻辑关系,对数据ai,除了存储其自身的信息之外,还需存储一 个指示其直接后继的信息(即直接后继的存储位置).这两部分信息组成数据元素ai的存储映像,称为结点(Node).N个 结点链结成一个链表,即为线性表(a1,a2,...,an)的链式存储结构,因为此链表的每个节点中只包含一个指针域,所以叫 做单链表. 我们把链表中的第一个结点的存储位置叫做头指针,,为了更方便地对链表进行操作,如删除第一个结 点的特殊情况(第一个结点没有前驱,而要摘除一

c语言-C语言中单向的链表反转?

问题描述 C语言中单向的链表反转? 这段代码实在看不懂啊,求解 Linklist *reverse(Linklist *head) //链表逆置 { Linklist *p,*t; p=head->next; t=p->next; p->next=NULL; while(t!=NULL) { p=t->next; t->next=head->next; head->next=t; t=p; } return head; } 其中之一:while中第二句head-&

单链表-利用原空间把链表反转

问题描述 利用原空间把链表反转 请问大家,如果我用头插法新建好了一个单链表,当我们想利用原空间把链表反转的 时候,我下面标注(1)和(2)是什么意思? (1)这样设定,不是把p->next和p指向一起了吗? //反转链表 void reverse(linklist L,int n) { linklist p,r; p=L->next; int i; for(i=1;i<=n;i++) { r=p->next; p->next=L->next; (1)--// 什么意思?

c语言-C语言中单向的链表反转

问题描述 C语言中单向的链表反转 node* reverse1(node * head) { node*p,*q,*r; p = head; q = head->next; head->next = NULL; while(q){ r = q->next; q->next = p; p = q; q = r; } head=p; /* while(p) { printf("%d ",p->num); p=p->next; }*/ printf(&qu

【27】链表反转

题目:给定一个单链表的头结点要求反转该链表并要求不能改变更改链表的结构 分析: 1. 假设一个链表如下     headNode -> node1 -> node2 -> node3 -> node4 -> NULL 2. 则反转完这个链表之后,希望得到如下链表     NULL <- headNode <- node1 <- node2 <- node3 <- node4 3. 此时链表的头结点变成了node4,我们可以枚举整个链表,对每一个结

单向链表反转

题目:已知单向链表的头结点head,写一个函数把这个链表逆序 ( Intel) 解答:我们假设单向链表的节点如下: template <typename T>class list_node{public:list_node * next;T data;}; 这个题目算是考察数据结构的最基础的题目了,有两种方法可以解此题: 方法一:     void reverse(node*& head)    {        if ( (head == 0) || (head->next =

全面分析再动手的习惯:链表的反转问题(递归和非递归方式)

定义一个方法(函数),实现输入一个链表的头结点,然后可以反转这个链表的方向,并输出反转之后的链表的头结点. typedef struct Node{ int data; Node *next; } Node, *List; 链表类的问题,涉及到了很多指针的操作,需要严谨的分析,全面的分析问题之后,在开始写代码,磨刀不误砍柴工!反转链表,直接的想法,就是把链表中指针的方向反转就可以了,如图所示: 假设 i 结点之前,我们把所有的结点的指针都已经反转了,那么自然 i 和以后的结点链接发生了断裂!如下

剑指Offer之反转链表

题目描述: 输入一个链表,反转链表后,输出链表的所有元素. (hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数. 输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素. 输出: 对应每个测试案例, 以此输出链表反转后的元素,如没有元素则输出NULL. 样例输入: 5 1 2 3 4 5 0 样例输出: 5 4 3 2 1 NULL [解

《剑指offer》-反转链表

输入一个链表,反转链表后,输出链表的所有元素. 题目考察链表反转,但是挖坑不是反转本身,而是题目的描述再次不清晰:什么叫"反转链表后输出链表所有元素"?给的代码框架只有一个函数ReverseList,返回值类型是ListNode*,输出不输出和我有什么关系? class Solution{ public: ListNode* ReverseList(ListNode* pHead){ if (pHead == NULL){ return NULL; } if (pHead->ne