剑指 Offer 24. 反转链表

题目:

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。


示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

限制:
0 <= 节点个数 <= 5000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

剑指 Offer 24. 反转链表

 1 /**
 2  *  @author 不乏理想的三师弟
 3  *  解法一 也就是题解中的迭代解法
 4  *  原理:
 5  *  由头结点开始,遍历链表;同时完成两件事:
 6  *  1、将当前结点的next指向前一个结点;
 7  *  2、并且对下一个结点也能做第一件事;
 8  *  
 9  *  用head代表当前结点,
10  *  要做的第一件事:head.next 指向前一个结点;
11  *  因此要有临时变量pre保存前一个结点;(初始时pre当然为null)
12  *  
13  *  (1)head.next = pre; // 将当前结点的next指向前一个结点;
14  *  
15  *  当执行语句(1)时,下一个结点的引用会被抹去;
16  *  因此在执行语句(1)之前,要另一个临时变量tem保存下一个结点:tem = head.next;
17  *  执行完语句(1)后,就准备操作下一个结点;
18  *  
19  *  (2)head = tem; // 准备操作下一个结点
20  *  
21  *  在执行语句(2)时,原本head的结点就会被抹去;
22  *  因此在执行语句(2)之前,要将head结点赋值给pre:pre = head;
23  *  
24  *  语句顺序如下:
25  *  head.next = pre; (1)
26  *  tem = head.next;
27  *  pre = head;
28  *  head = tem; (2)
29  */
30 public static ListNode reverseList(ListNode head) {
31     if(head == null) return null;
32     ListNode pre = null, tem = null;
33     
34     // 为了不打乱语句的逻辑顺序就用break来跳出循环
35     while (true) {
36         tem = head.next;
37         head.next = pre; 
38         if (tem == null) {
39             // beak要在head.next = pre后执行;
40             // 因为在最后一刻还要将当前结点的next指向前一个结点
41             break; 
42         }
43         pre = head;
44         head = tem;
45     }
46     return head;
47 }

 

剑指 Offer 24. 反转链表

上一篇:机器学习-dataset、dataloader的使用(pytorch环境)


下一篇:Codeforces Round #737 (Div. 2) 部分题题解