swap nodes in pairs(成對的交換連結串列結點)
阿新 • • 發佈:2019-01-09
題目描述
Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given1->2->3->4, you should return the list as2->1->4->3.
Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.
題目大意
給定一個連結串列,交換每兩個相鄰的連結串列結點。
不能修改結點值,只改變連結串列指向。
思路
首先是遞迴思路,在遞迴過程中,判斷結點的情況,共有三種情況:
(1)當前結點為NULL,或者當前結點是落單的結點;
(2)正好剩下最後一對結點;
(3)還剩至少三個以上的結點。
針對第一種情況,直接返回該結點給上一層遞迴呼叫的地方;
針對第二種情況,就直接交換指向,然後把當前的第一個結點返回;
針對第三種情況,交換結點指向,並且,遞迴判斷下面的結點。
程式碼
#include<iostream> using namespace std; // Definition for singly-linked list. struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; typedef ListNode* node; ListNode *swapPairs(ListNode *head) { // 當前結點是NULL // 或者當前結點落單了,沒有與之成對的結點 if(head==NULL || head->next==NULL) { return head; } // 當前的結點是最後一對結點,再往下是NULL else if(head->next->next == NULL) { node tmp_node = head->next; tmp_node->next = head; head->next = NULL; // 把原先的第一個結點的指向置為NULL return tmp_node; // 返回當前的第一個結點 } // 還有至少三個及以上的結點 else { node tmp_node = head->next; node new_node = tmp_node->next; tmp_node->next = head; head->next = swapPairs(new_node); // 繼續向後遞迴 return tmp_node; } } int main() { return 0; }
以上。