力扣 24.两两交换链表中的节点
力扣《反转链表》系列文章目录
刷题次序,由易到难,一次刷通!!!
题目 | 题解 |
---|---|
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;}
}