LeetCode206 给你单链表的头节点 head,请你反转链表,并返回反转后的链表。
示例1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
1. 建立虚拟头结点辅助反转
思路:
新定义一个
ans
节点,让它作为链表的头部,每次循环遍历链表,ans
节点都与 原链表中最新 的节点连接,比如 :初始化 ListNode ans = new ListNode(-1),值为 -1
head = 1 -> 2 -> 3 -> 4
循环次数:(注意观察值的变化)
第一次 : ans =
-1 -> 1
,head =2 -> 3 -> 4
第二次: ans =
-1 -> 1 -> 2
,head =3 -> 4
第三次: ans =
-1 -> 1 -> 2 -> 3
,head =4
第四次: ans =
-1 -> 2 -> 3 -> 4
,head =null
记住在遍历的时候,一定要提前保存好 头节点,不然遍历到下一次的时候就丢了。
最后在返回的时候,要返回 ans.next,因为 ans作为头节点的值是 -1,后面才是反转后的值
代码:
public static ListNode reverselistNode(ListNode head) {
ListNode ans = new ListNode(-1);
ListNode cur = head;
while(cur != null) {
// 保存下一个节点,不然在遍历中会丢
ListNode next = cur.next;
cur.next = an.next;
ans.next = cur;
// 前面已经让 cur 发生变化了,现在让 cur 指向下一个节点
cur = next;
}
return ans.next;
}
2. 直接操作链表实现反转
这次就与上次不同了,但是思想是差不多的,上次是借助虚拟节点 ans 实现的反转,可能会在面试时会被禁止使用,原因是不借助虚拟节点更难。
这里是直接操作原来的链表,返回的链表引用地址的一样的
代码:
public static ListNode reverseListNode(ListNode head) {
ListNode prev = null;
ListNode cur = head;
while(cur != null) {
// 保存下一个节点
ListNode next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return prev;
}