题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
例子
# 例1
输入:head = [1,2,3,4]
输出:[2,1,4,3]
# 例2
输入:head = []
输出:[]
# 例3
输入:head = [1]
输出:[1]
这里建议画图来思考,不然太容易混乱
如例1所示,首先我们定义一个虚拟头节点
(需要定义两个临时变量,存储节点)
第一步,将虚拟头节点的指向,指向实际的第二个节点
第二步,实际的第二个节点,指向实际的第一个节点
第三步,实际的第一个节点,指向实际的第三个节点
然后,将虚拟头节点后移两位
代码
(Python)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
# 定义一个虚拟头节点
dummyhead = ListNode(0, head)
cur = dummyhead
while ((cur.next != None) and (cur.next.next != None)):
# 临时节点
temp1 = cur.next
temp2 = cur.next.next.next
# 交换位置
cur.next = cur.next.next # 第一步
cur.next.next = temp1 # 第二步
cur.next.next.next = temp2 # 第三步
# 将 cur 后移两位
cur = cur.next.next
return dummyhead.next
(C++)
// 定义节点
struct ListNode{
int val;
ListNode* next;
ListNode(): val(0), next(nullptr) {}
ListNode(int x): val(x), next(nullptr) {}
ListNode(int x, ListNode* next): val(x), next(next) {}
};
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
// 定义虚拟头节点
ListNode* dummyhead = new ListNode(0, head);
ListNode* cur = dummyhead;
while ((cur->next != NULL) && (cur->next->next != NULL)) {
// 定义临时节点
ListNode* temp1 = cur->next;
ListNode* temp2 = cur->next->next->next;
cur->next = cur->next->next; // 第一步
cur->next->next = temp1; // 第二步
cur->next->next->next = temp2; // 第三步
cur = cur->next->next; // 虚拟头节点后移两位
}
head = dummyhead->next;
delete dummyhead;
return head;
}
};