Day78 | 灵神 | 反转链表 两两交换链表中的节点
24.两两交换链表中的节点
24. 两两交换链表中的节点 - 力扣(LeetCode)
思路:
这道题就是下面这道题的k==2的情况
25. K 个一组翻转链表 - 力扣(LeetCode)
基本思路和92. 反转链表 II - 力扣(LeetCode)一样
用第一个例子[1,2,3,4,5]作为说明,就是说,步骤为
1.建立虚拟头结点t,作为要反转部分[1,2]的前一个节点,以后每反转一部分都要更新和保存反转部分的前一个节点
2.再次建立一个临时节点q保存要反转部分的后一个结点[3]
3.建立两个指针指向要交换的两个节点,cur指向2,pre指向1
4.反转指针把2指向1
5.把反转部分接到原来链表上
- 5.1 [1]的next即pre的next指向[3],即q,这是把后面接好了
- 5.2 虚拟头结点t的next指向[2],即cur,这是把前面接好了
6.更新并保存t,把t更新为1,即pre,因为pre是下一段要反转部分[3,4]的前一个节点
完整代码:
class Solution {
public:ListNode* swapPairs(ListNode* head) {//1.建立虚拟头结点ListNode * t=new ListNode;t->next=head;ListNode * res=t;while(t&&t->next&&t->next->next){//2,3步ListNode *pre=t->next;ListNode *cur=pre->next;ListNode *q=cur->next;//4cur->next=pre;//5.pre->next=q;t->next=cur;//6.t=t->next->next;}return res->next;}
};