给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
方法一:递归
用 head 表示原始链表的头节点,新的链表的第二个节点;
用 newHead 表示新的链表的头节点,原始链表的第二个节点,则原始链表中的其余节点的头节点是 newHead.next。
令 head.next = swapPairs(newHead.next),表示将其余节点进行两两交换,交换后的新的头节点为 head 的下一个节点。
然后令 newHead.next = head,即完成了所有节点的交换。
最后返回新的链表的头节点 newHead。
c++实现:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if (head == nullptr || head->next==nullptr){
return head;
}
//newHead 表示新的链表的头节点,原始链表的第二个节点
ListNode* newhead = head->next;
//将其余节点进行两两交换,交换后的新的头节点为 head 的下一个节点。
head->next = swapPairs(newhead->next);
//newHead.next = head,即完成了所有节点的交换
newhead->next=head;
//返回新的链表的头节点 newHead。
return newhead;
}
};
golang实现
func swapPairs(head *ListNode) *ListNode {
if head == nil || head.Next==nil {
return head
}
//newHead 表示新的链表的头节点,原始链表的第二个节点
newhead := head.Next
//将其余节点进行两两交换,交换后的新的头节点为 head 的下一个节点。
head.Next = swapPairs(newhead.Next)
//newHead.next = head,即完成了所有节点的交换
newhead.Next = head
//返回新的链表的头节点 newHead。
return newhead
}
复杂度分析
方法二:迭代
创建哑结点 dummyHead,令 dummyHead.next = head。
令 temp 表示当前到达的节点,初始时 temp = dummyHead。每次需要交换 temp 后面的两个节点。
如果 temp 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得 temp 后面的两个节点 node1 和 node2,通过更新节点的指针关系实现两两交换节点。
具体而言,交换之前的节点关系是 temp -> node1 -> node2,交换之后的节点关系要变成 temp -> node2 -> node1,因此需要进行如下操作。
完成上述操作之后,节点关系即变成 temp -> node2 -> node1。再令 temp = node1,对链表中的其余节点进行两两交换,直到全部节点都被两两交换。
两两交换链表中的节点之后,新的链表的头节点是 dummyHead.next,返回新的链表的头节点即可。
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode *dummynode = new ListNode(0);
dummynode->next=head;
ListNode *temp = dummynode;
while (temp->next != nullptr && temp->next->next != nullptr){
ListNode *node1 = temp->next;
ListNode *node2 = node1->next;
temp->next = node2;
node1->next = node2->next;
node2->next=node1;
temp = node1;
}
return dummynode->next;
}
};
func swapPairs(head *ListNode) *ListNode {
//定义哑节点
dummynode := &ListNode{0,head}
temp := dummynode
for temp.Next != nil && temp.Next.Next != nil {
node1 := temp.Next
node2 := temp.Next.Next
temp.Next = node2
node1.Next = node2.Next
node2.Next = node1
temp = node1
}
return dummynode.Next
}
复杂度分析