LeetCode 第 24 號問題:兩兩交換鏈表中的節點

本文首發於公衆號「五分鐘學算法」,是圖解 LeetCode 系列文章之一。node

我的網站:www.cxyxiaowu.comgit

題目來源於 LeetCode 上第 24 號問題:兩兩交換鏈表中的節點。題目難度爲 Medium,目前經過率爲 45.8% 。github

題目描述

給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換後的鏈表。算法

你不能只是單純的改變節點內部的值,而是須要實際的進行節點交換。bash

示例:動畫

給定 1->2->3->4, 你應該返回 2->1->4->3.
複製代碼

題目解析

該題屬於基本的鏈表操做題。網站

  • 設置一個虛擬頭結點dummyHead
  • 設置須要交換的兩個節點分別爲node1node2,同時設置node2的下一個節點next
在這一輪操做中
  • node2節點的next設置爲node1節點
  • node1節點的next設置爲next節點
  • dummyHead節點的next設置爲node2
  • 結束本輪操做

接下來的每輪操做都按照上述進行。ui

動畫描述

代碼實現

// 24. Swap Nodes in Pairs
// https://leetcode.com/problems/swap-nodes-in-pairs/description/
// 時間複雜度: O(n)
// 空間複雜度: O(1)
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {

        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;

        ListNode* p = dummyHead;
        while(p->next && p->next->next){
            ListNode* node1 = p->next;
            ListNode* node2 = node1->next;
            ListNode* next = node2->next;
            node2->next = node1;
            node1->next = next;
            p->next = node2;
            p = node1;
        }

        ListNode* retHead = dummyHead->next;
        delete dummyHead;

        return retHead;
    }
};

複製代碼

相關文章
相關標籤/搜索