タイトル
リンクリストを考えると、すべての2つの隣接ノードを交換し、その頭を返します。
あなたはありませんだけで、それ自体を変更することができるノードは、リストのノードの値を変更します。
例:
> 2 - > 3 - > 4 1-考えると、あなたは、2-> 1 - > 4 - > 3としてリストを返す必要があります。
考え
思考:横断為替
この質問は、私たちは、リスト上のペアごとの交換を必要とし、
ヘッダを交換する方法1.
リストのヘッダにセカンダリノードを追加し、何度も使用されています。ここに。
ListNode* result = new ListNode(-1);
result->next = head;
各2つのスイッチングリストする方法2.
次のノード(CUR)、現在のノード(第一)、現在のノード(第2)の現在のノードは、図中の交換原理:交換リストには3つのノードを含みます。 :
そして、スイッチング動作は以下を達成するために:
first->next = second->next;
cur->next = second;
cur->next->next = first;
あなたが交換することができるかどうか3.どのように決定する
ことを確実にするためでなければならないスワップリストを
ので、判定条件を増やし、現在のノードの次のノードと次の次のノードが存在している必要があります。
再帰:2を考えます
簡単に図3に示すように、実際に再帰的操作である、2つのノード交換リストの各起こり得ます。
C ++
- 思考
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head == nullptr || nullptr)
return head;
ListNode* result = new ListNode(0);
result->next = head;
ListNode* cur = result;
while(cur->next != nullptr && cur->next->next != nullptr){
ListNode* first = cur->next;
ListNode* second = cur->next->next;
//节点交换
first->next = second->next;
cur->next = second;
cur->next->next = first;
cur = cur->next->next;
}
return result->next;
}
};
- アイデア2
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head == nullptr || head->next == nullptr)
return head;
ListNode* result = head -> next;
head->next = swapPairs(result->next);
result->next = head;
return result;
}
};