1. 程式人生 > >LeetCode 24——兩兩交換連結串列中的節點

LeetCode 24——兩兩交換連結串列中的節點

1. 題目

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 == NULL || head->next == NULL)   return head; // 沒有結點或只有一個結點
        
        ListNode *p1 = head;
        ListNode *p2 = head->next;
        ListNode *p3 = NULL;
        
        ListNode *temp = head->next; // 交換後的頭結點為原連結串列的第二個結點
        head = new ListNode(0); // 新建哨兵結點方便操作

        while (1)
        {
            p3 = p2->next;
            
            p2->next = p1;  // 第一步,交換結點
            head->next = p2;    // 第二步,連線交換後的兩個結點到新連結串列中
            head = p1;  // 第三步,指向新連結串列尾結點
            head->next = p3;    // 第四步,連線原連結串列後面的結點到新連結串列中
            
            if (p3 && p3->next)
            {
                p1 = p3;
                p2 = p1->next;
            }
            else
            {
                break;
            }    
        }
        
        return temp;
        
    }
};

獲取更多精彩,請關注「seniusen」!