力扣《反转链表》系列文章目录
刷题次序,由易到难,一次刷通!!!
题目 | 题解 |
---|---|
206. 反转链表 | 反转链表的全部 题解1 |
92. 反转链表 II | 反转链表的指定段 题解2 |
24. 两两交换链表中的节点 | 两个一组反转链表 |
25. K 个一组翻转链表 | K 个一组反转题解3 |
一、题目
二、解题思路
对于反转指定段的链表,都采用将所需要反转的这一段单独摘出来,先记录好这段的上一个节点和下一个节点。将需要反转的部分反转好之后,再将其正确链接回原链表,参照下图。
创建一个哑节点(dummy node),它的next指向头节点,这样可以简化边界条件的处理。接着,使用一个while循环来遍历链表,采用两个每次循环交换一对相邻的节点。最后,返回哑节点的next,即交换后的链表的头节点。
注意:对 cur 进行赋值前,必须检验 pre 是否为 null,不是 null 才可以对 cur 进行赋值。
三、代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0, head);// 创建一个哑节点(dummy node),它的next指向头节点,这样可以简化边界条件的处理
ListNode ppre = dummy;
ListNode pre = dummy.next;
if (pre == null) {
return head;
}
ListNode cur = pre.next;
while (cur != null) {
ListNode nxt = cur.next;// 保存“下一个节点”
cur.next = pre;// 反转
pre.next = nxt;// 连回原链表的“下一个节点”
ppre.next = cur;// 连回原链表的“上一个节点”
ppre = pre;
pre = pre.next;
if (pre == null) {
break;
} else {
cur = pre.next;
}
}
return dummy.next;
}
}