https://leetcode-cn.com/problems/swap-nodes-in-pairs/
我的方法一:迭代
步骤
- 每两个节点进行处理,node1和node2分别表示当前2个节点的首节点和尾节点;pre节点表示上一对节点的尾节点;
1.1 交换两个节点,并pre指向交换后的首节点;尾节点指向后一对节点; - Sentinel节点表示一个哑节点,指向当前第一个节点,为了处理上非空判断的方便;pre也指向Sentinel;
- 当最后一对节点都为空,或者有一个为空时,就停止
初始条件
- Sentinel指向head;
- node1指向head,node2指向head的next
- pre指向Sentinel
边界条件
- node1为空,或者node2为空
复杂度
时间复杂度:O(N),因为遍历一遍即可
空间复杂度:O(1),只需要Sentinel、node1、node2、pre等固定的几个辅助空间
代码
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode sentinel;
sentinel.next = head;
ListNode* node1 = head;
ListNode* node2 = head ? head->next:0;
ListNode* pre = &sentinel;
ListNode* next_couple = 0;//for swap
while(node1 && node2){
pre->next = node2;
next_couple = node2->next;
node2->next = node1;
node1->next = next_couple;
pre = node1;
node1 = next_couple;
node2 = next_couple?next_couple->next:0;
}
return sentinel.next;
}
};
网友评论