jz24.反转链表

题目描述

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

示例:

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

题解

双指针

使用双指针的方法, 过程见图:

1
2
3
4
5
6
7
8
9
10
11
12
public ListNode reverseList(ListNode head) {
ListNode cur = null;
ListNode pre = head;
while (pre!=null){
ListNode temp = pre.next;
pre.next = cur;
cur = pre;
pre = temp;

}
return cur;
}

代码要点在于, 每遍历到一个节点, 一定要记录下pre 的下一个节点, 因为一旦反转之后, 就无法直接通过.next继续遍历

递归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public ListNode reverseList(ListNode head) {
//递归终止条件是当前为空,或者下一个节点为空
if(head==null || head.next==null) {
return head;
}
//这里的cur就是最后一个节点
ListNode cur = reverseList(head.next);
//这里请配合动画演示理解
//如果链表是 1->2->3->4->5,那么此时的cur就是5
//而head是4,head的下一个是5,下下一个是空
//所以head.next.next 就是5->4
head.next.next = head;
//防止链表循环,需要将head.next设置为空
head.next = null;
//每层递归函数都返回cur,也就是最后一个节点
return cur;
}
-------------本文结束感谢您的阅读-------------
可以请我喝杯奶茶吗