Leetcode 24. Swap Nodes in Pairs
题目
解法:iterative或recursion
链表最基础的操作,必须要会的
首先讲iterative的步骤:
- 定义一个dummy node储存指向链表头部的指针,用来最后返回结果
- 定义一个prev_node,参与交换过程,保存指向下一组交换的两个节点中交换后的第一个节点指针,这样才能track整条列表
- 取出当前需要交换的两个节点,建议重新命名,这样就不会导致交换的时候很多next搞混
- 进行交换,先断开第一个节点指向第二个节点的指针,将这个指针指向第二个节点的下一个节点;然后将第二个节点的指针指向第一个节点。必须以这个顺序交换,否则会丢失后面的节点
- 重新初始化prev_node和head,以准备下一次交换,prev_node总是指向head的
python:
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
#定义dummy node指向头节点
dummy = ListNode(-1)
dummy.next = head
#定义prev node来保存交换时需要的临时节点
prev_node = dummy
while head and head.next:
#需要交换的节点
first_node = head
second_node = head.next
#交换
prev_node.next = second_node
first_node.next = second_node.next
second_node.next = first_node
#调整head位置
prev_node = first_node
head = first_node.next
return dummy.next
Recursive解法相对来说更巧妙也更简洁,同样分成取出需交换节点进行重命名,然后进行交换操作。
C++
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
//如果只剩一个节点或者没有节点无需进行交换
if (!head || !head->next) return head;
//需要交换的节点
ListNode *first_node = head;
ListNode *second_node = head->next;
//进行交换
first_node->next = swapPairs(second_node->next);
second_node->next = first_node;
//现在second节点是头节点
return second_node;
}
};
参考链接:https://leetcode.com/problems/swap-nodes-in-pairs/solution/