iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
佛心分享-刷題不只是刷題

只是單純想刷題XD系列 第 24

只是單純想刷題XD Day24

  • 分享至 

  • xImage
  •  

題目

https://ithelp.ithome.com.tw/upload/images/20241006/201603207v1qiY4evS.jpg

題目翻譯

給一個連結陣列,交換兩兩相鄰的節點並且回傳。
範例: 1->2->3->4, return 2->1->4->3。
你的演算法不能改變節點裡面的值,只能把節點搬來搬去。

解題思路

這題要求我們將單鏈表的節點兩兩交換,並返回交換後的鏈表。這是一個鏈表操作問題,核心在於如何處理節點指針來實現交換。

具體步驟

  1. 初始判斷:檢查鏈表是否至少有兩個節點可進行交換。如果鏈表為空或只有一個節點,直接返回原始鏈表。

  2. 更新頭節點:由於第一對節點的交換會更改頭節點,因此在交換第一對節點時,需要將第二個節點設為新的頭節點。

  3. 兩兩交換節點

    • 使用一個指針 temp 來遍歷鏈表,每次操作一對節點,將下一對節點與當前操作的節點進行交換。
    • 每次交換一對節點後,更新指針,跳過已經交換過的節點,繼續下一對節點的交換。
  4. 終止條件:當剩下的節點數量少於兩個時,停止交換。

code

改進程式碼進一步提高可讀性,並保持原始解法的邏輯。

/**
 * 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 || !head->next) {
            return head;
        }

        // 初始化新的頭節點,為原始頭節點的下一個節點
        ListNode* newHead = head->next;
        ListNode* temp = head;

        // 遍歷並交換每一對節點
        while (temp && temp->next) {
            ListNode* nextPair = temp->next->next;
            temp->next->next = temp; // 將下一個節點指向當前節點
            if (nextPair && nextPair->next) {
                temp->next = nextPair->next; // 將當前節點指向下一對的第二個節點
            } else {
                temp->next = nextPair; // 將當前節點指向下一對的第一個節點或NULL
            }
            temp = nextPair; // 繼續處理下一對節點
        }

        return newHead;
    }
};

上一篇
只是單純想刷題XD Day23
下一篇
只是單純想刷題XD Day25
系列文
只是單純想刷題XD30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言