1.题目介绍
2.题解
2.1 递归
思路
抓住两个关键点:1.何时终止递归:为空或者是只有一个节点时均无法进行交换(至少两个节点) 2. 如何交换:设置一个newhead,其next指向head;而head的next指向原来newhead的next,但注意这里newhead的next的两个节点也进行了交换,所以使用递归的方式指向交换过的节点
代码
/**
* Definition for singly-linked list.
* 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) {
if (head == nullptr || head -> next == nullptr) return head;
ListNode* newhead = head -> next;
head -> next = swapPairs(newhead->next);
newhead->next = head;
return newhead;
}
};
2.2 迭代
思路
总体思路是使用一个临时节点指针temp指向要交换两个节点的前一个节点(对于首节点和第二节点创建一个哑结点,三个节点方便链表交换!!!)
然后temp不断向后遍历,直到后面没有节点或者只有一个节点无法交换.
代码
/**
* Definition for singly-linked list.
* 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* temp = dummyHead;
while (temp->next != nullptr && temp->next->next != nullptr) {
ListNode* node1 = temp->next;
ListNode* node2 = temp->next->next;
temp->next = node2;
node1->next = node2->next;
node2->next = node1;
temp = temp->next->next;
}
ListNode* ans = dummyHead->next;
delete dummyHead;
return ans;
}
};
标签:24,head,ListNode,temp,nullptr,next,链表,节点
From: https://www.cnblogs.com/trmbh12/p/17972931