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