[LeetCode] 24. 兩兩交換鏈表中的節點

1 題目描述

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

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

示例:

給定 1->2->3->4, 你應該返回 2->1->4->3.

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/swap-nodes-in-pairs
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

2 解題思路

採用的方法是遞歸,遞歸題目的詳細瞭解和總結,可以看另一篇博客 套路俘虜–遞歸–的芳心,就是你,沒錯了~~,非常簡潔容易理解

這個題目要求我們從第一個節點開始兩兩交換鏈表中的節點,且要真正的交換節點。

從鏈表的頭節點 head 開始遞歸。
每次遞歸都負責交換一對節點。由 firstNode 和 secondNode 表示要交換的兩個節點。
下一次遞歸則是傳遞的是下一對需要交換的節點。若鏈表中還有節點,則繼續遞歸。
交換了兩個節點以後,返回 secondNode,因爲它是交換後的新頭。
在所有節點交換完成以後,我們返回交換後的頭,實際上是原始鏈表的第二個節點。

3 解決代碼

  • java代碼
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        //第一步,尋找終止條件,當鏈表爲空或者只有一個節點的時候,就沒得交換了,交換終止,返回處理好的部分
        if(head == null || head.next == null){
            return head;
        }
        
        //第二步,本層循環應該做什麼
        ListNode firstNode = head;
        ListNode secondNode = head.next;
        //交換節點
        firstNode.next = swapPairs(secondNode.next);
        secondNode.next = firstNode;
        
        
        //第三步,返回值,交換後應該返回已經處理好的部分,返回 secondNode,因爲它是交換後的新頭。
        return secondNode;
    }
}
  • python代碼
# 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:
        //第一步,尋找終止條件,當鏈表爲空或者只有一個節點的時候,就沒得交換了,交換終止,返回處理好的部分
        if not head or not head.next :
            return head;
        //第二步,本層循環應該做什麼
        firstNode = head
        secondNode = head.next
        //交換節點
        firstNode.next = self.swapPairs(secondNode.next)
        secondNode.next = firstNode
        //第三步,返回值,交換後應該返回已經處理好的部分,返回 secondNode,因爲它是交換後的新頭。
        return secondNode
發佈了242 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章