LeetCode 24. 兩兩交換連結串列中的節點
24. 兩兩交換連結串列中的節點
題目來源:
題目
給定一個連結串列,兩兩交換其中相鄰的節點,並返回交換後的連結串列。
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例:
給定 1->2->3->4, 你應該返回 2->1->4->3.
解題思路
本題中,要求實際的進行節點交換,不僅僅是單純的改變節點內部的值。
在這裡,其實有遞迴跟非遞迴兩種思路,但是核心思想類似,都是要交換相鄰節點的連結串列形態完成整個連結串列的調整。
思路一:遞迴
使用遞迴時,需要明確終止條件,其次,對於完整的呼叫棧先不要急於下手,這樣一層層下來,很容易無從下手。遞迴,主要是不斷重複相同的事情,但遇到終止條件時會層層返回。在這種情形下,可以考慮先關注一層呼叫單元的情況。
在這裡,我們首先要明確的是:終止的條件,返回內容 ,以及當前層呼叫單元具體做了什麼。
接著看本題:
- 終止條件:就是 head 為空,或者 head.next 為空。這表示連結串列沒有節點,或者只有一個節點,這樣將無法交換,也就是終止條件。
- 返回內容:返回的是交換完成的子連結串列。
- 呼叫單元:在這裡 ,設前後節點 front_node, tail_node,對兩個節點進行交換,front_node 連線後面交換完成的子連結串列,tail_node 連線 front_node。
這就是遞迴的思路。
思路二:非遞迴
非遞迴跟遞迴的思路其實是相類似的。
設前後節點 front_node 和 tail_node,核心同樣是交換前後節點,但是要增加輔助節點 pre,記錄 front_node 的前節點。
具體演算法:
- 定義前後節點 front_node,tail_node;
- 交換前後節點;
- 更新 pre.next 指向交換後的頭;
- 迴圈結束,返回最後的交換結果。
具體的程式碼實現如下。
程式碼實現
遞迴
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
# 如果連結串列為空,或者只有一個節點,直接返回 head
if not head or not head.next:
return head
# 需交換的前後節點
front_node = head
tail_node = head.next
# 交換節點
front_node.next = self.swapPairs(tail_node.next)
tail_node.next = front_node
return tail_node
非遞迴
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
# dummy 簡化邊界條件
dummy = ListNode(-1)
dummy.next = head
pre = dummy
while head and head.next:
front_node = head
tail_node = head.next
# 交換
pre.next = tail_node
front_node.next = tail_node.next
tail_node.next = front_node
# 重置 pre, head
pre = front_node
head = front_node.next
return dummy.next
實現結果
遞迴結果:
非遞迴結果:
以上就是使用遞迴和非遞迴的思路,對連結串列相鄰節點進行交換,解決《兩兩交換連結串列中的節點》問題的主要內容。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1600/viewspace-2825179/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- leetcode 24.兩兩交換連結串列中的節點LeetCode
- 10.13 每日一題 24. 兩兩交換連結串列中的節點每日一題
- leetcode 24 兩兩交換連結串列中的節點LeetCode
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- 【leetcode】24. Swap Nodes in Pairs 連結串列奇偶節點交換LeetCodeAI
- **24. 兩兩交換連結串列中的節點****19.刪除連結串列的倒數第N個節點****面試題 02.07. 連結串列相交****142.環形連結串列II**面試題
- Day 4 | 24. 兩兩交換連結串列中的節點 、 19.刪除連結串列的倒數第N個節點 、面試題 02.07. 連結串列相交 、142.環形連結串列II面試題
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- 第四天:● 24. 兩兩交換連結串列中的節點 ● 19.刪除連結串列的倒數第N個節點 ● 面試題 02.07. 連結串列相交 ● 142.環形連結串列II面試題
- Java連結串列指標確實好煩 - 交換連結串列中連續的兩個節點的位置Java指標
- 程式碼隨想錄第4天 | 24. 兩兩交換連結串列中的節點、19.刪除連結串列的倒數第N個節點、面試題 02.07. 連結串列相交、142.環形連結串列II面試題
- 程式碼隨想錄演算法訓練營第四天 | 連結串列 24.兩兩交換連結串列中的節點 19.刪除連結串列的倒數第N個節點 142.環形連結串列II演算法
- 程式碼隨想錄演算法訓練營day04|24.兩兩交換連結串列中的節點,19.刪除連結串列的倒數第N個節點,面試題 02.07.連結串列相交,142.環形連結串列II演算法面試題
- 04天【程式碼隨想錄演算法訓練營34期】 第二章 連結串列part02 (● 24. 兩兩交換連結串列中的節點 ● 19.刪除連結串列的倒數第N個節點 ● 面試題 02.07. 連結串列相交 ● 142.環形連結串列II )演算法面試題
- 程式碼隨想錄day4 | 24 兩兩交換連結串列節點 19 刪除倒數第n個節點 142 環形連結串列
- leetcode----刪除連結串列中的節點LeetCode
- 【LeetCode】【連結串列】劍指 Offer 52. 兩個連結串列的第一個公共節點 思路解析和程式碼LeetCode
- 演算法單連結串列交換任意兩個元素演算法
- leetcode:21. 合併兩個有序連結串列(連結串列,簡單)LeetCode
- [連結串列]leetcode1019-連結串列中的下一個更大節點LeetCode
- 程式碼隨想錄演算法訓練營第4天 | 連結串列兩兩交換、刪除倒N、連結串列相交、環形連結串列演算法
- 連結串列面試題(十三)---求兩個都不帶環的連結串列相交的結點面試題
- 連結串列面試題(四)---查詢連結串列的中間節點面試題
- 有a,b兩個已按學號升序排序的連結串列,每個連結串列中的結點包括學號、成績。要求把兩個連結串列合併,仍按學號升序排列。...排序
- leetcode雙週賽(2)-合併兩個連結串列LeetCode
- 每日leetcode——21. 合併兩個有序連結串列LeetCode
- 連結串列面試題(七)---合併兩個有序連結串列面試題
- Leetcode刷題之連結串列增加頭結點的字首節點LeetCode
- Java兩種方式實現連結串列的刪除,返回頭結點Java
- 建立連結串列兩種方法的區別
- 演算法5: LeetCode_單連結串列_兩數相加演算法LeetCode
- Leetcode 21 合併兩個有序連結串列 學習感悟LeetCode
- LeetCode每日一題:刪除連結串列中的節點(No.237)LeetCode每日一題
- TCP 中的兩個細節點TCP
- 劍指offer——兩個連結串列的第一個公共結點C++C++
- LeetCode-2. 兩數相加(連結串列+大數加法模擬)LeetCode
- 【LeetCode Hot 100】21. 合併兩個有序連結串列LeetCode
- Redis筆記 — 連結串列和連結串列節點的API函式(三)Redis筆記API函式