1. 程式人生 > >swap nodes in pairs(成對的交換連結串列結點)

swap nodes in pairs(成對的交換連結串列結點)

題目描述

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;
}

以上。