题目:
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
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 }