1.LeetCode206题
https://leetcode.cn/problems/reverse-linked-list/submissions/486178706/
1.1建立虚拟头结点辅助反转
首先可以建立一个虚拟的结点ans,并且令ans.next=head,这样可以很好的简化我们的操作,如下图,我们将链表{1->2->3->4->5}进行反转,我们首先建立虚拟结点接到ans后面,然后将其他线调整好就可以了
如上图所示,我们完成最后一步之后,只要返回ans.next就得到了反转的链表,代码如下:
//方法1:创建虚拟结点发
public static ListNode reverseListByDummyNotCreate(ListNode head) {
// 创建一个虚拟头节点,初始时指向 -1
ListNode ans = new ListNode(-1);
// cur 指向当前节点,初始为链表的头节点
ListNode cur = head;
while (cur != null) {
// next 指向当前节点的下一个节点
ListNode next = cur.next;
// 将当前节点的 next 指针指向 ans 的下一个节点,实现反转
cur.next = ans.next;
// 将 ans 的 next 指针指向当前节点,更新 ans 的指向
ans.next = cur;
// 将 cur 指针后移一位,继续遍历链表
cur = next;
}
// 返回反转后的链表头节点
return ans.next;
}
1.2直接操作链表实现反转
上面的方式虽然好理解应用也广 ,但是在面试的时候可能会被考官禁止,因为更考察面试者的能力。
在图中,cur本来指向旧链表的首结点,pre表示已经调整好的新链表的表头,next是下一个要调整的。注意图中箭头方向,cur和pre是两个表的表头,移动过程中cur经过一次中间状态之后,又重新变成了两个链表的表头。
public static ListNode reverseListSimple(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}