1. 程式人生 > >關於LeetCode中Swap Nodes in Pairs一題的理解

關於LeetCode中Swap Nodes in Pairs一題的理解

題目如下:

Given a linked list, swap every two adjacent nodes and return its head.

For example,
Given 1->2->3->4, you should return the list as 2->1->4->3.

Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.

    題目也是非常容易理解,給定一個連結串列,交換“所有”兩個毗鄰的節點,然後返回表頭。為了更好地說明題乾的意思,咱們還是來看一下題幹中給的例子。給定一個連結串列1->2->3->4,交換之後變成了2->1->4->3也就是說,他是一對一對進行交換的,是先將所有連結串列分好堆,然後交換堆裡的兩個節點,並不存在一個堆中的元素和另一個堆中的元素進行交換的情況。就是說,上述連結串列第一次交換進行完之後變為2->1->3->4,下一次交換直接在3->4進行,不是在1->3進行。

    好了,明確了題乾的意思之後,我們就要開始進行分析了。我們可以把新連結串列的形成大致分解成兩個過程,首先是連結串列開始處“堆”中的兩個元素進行交換,然後是交換後的位置在後面的元素應該指向下一個“正確的”元素,什麼是“正確的”元素呢?就是當前“堆”緊挨著的下一個“堆”,我們只要將這個“堆”中的元素進行交換,然後將交換後位置較前的元素返回給上一個“堆”中位置靠後的元素的next即可。這個過程以此類推,直到連結串列最後位置,值依次向前返回,是一個自底向上的過程,顯然需要用“遞迴”的方式來解決,編碼時注意邊界條件及開始節點為null的情況的判定即可。老規矩,上已Accepted的程式碼:

public ListNode swapPairs(ListNode head) {
        if(head==null){
            return null;
        }
        ListNode nxt = head.next;
        if(head.next!=null){
            head.next = nxt.next;
            nxt.next = head;
            head.next = swapPairs(head.next);
        }else{
            return head;
        }
        return nxt;
    }
    然後是評論區的程式碼,推薦這個無遞迴版,我就喜歡這種不用遞迴就要倒節點的程式設計師,程式碼如下:
public ListNode swapPairs(ListNode head) {
    ListNode dummy = new ListNode(0);
    dummy.next = head;
    ListNode current = dummy;
    while (current.next != null && current.next.next != null) {
        ListNode first = current.next;
        ListNode second = current.next.next;
        first.next = second.next;
        current.next = second;
        current.next.next = first;
        current = current.next.next;
    }
    return dummy.next;
}
    上面的程式碼大家應該都能看懂,我就不過多進行解釋了,但是這種方法真的很重要!如果實在不明白的話就自己用這種方式跑一遍連結串列1->2->3->4->5,肯定能懂。然後還有個哥們在這個回答的reply區貼了一個簡單的過程分析,可以去看一看,地址在這裡,reply的那個人叫ravi2:https://discuss.leetcode.com/topic/10649/my-simple-java-solution-for-share/4

    大致就是這樣了,今天搬到了新工位,有新電腦用,這個feel不得不說還是棒兒爽的,哈哈!

相關推薦

關於LeetCodeSwap Nodes in Pairs理解

題目如下: Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return

(Java) LeetCode 24. Swap Nodes in Pairs —— 兩兩交換鏈表的節點

only title The reverse elf link 反轉鏈表 ould not Given a linked list, swap every two adjacent nodes and return its head. Example: Given 1-&

LeetCodeSwap Nodes in Pairs(兩兩交換連結串列的節點)

這是LeetCode裡的第24題。 題目要求: 給定一個連結串列,兩兩交換其中相鄰的節點,並返回交換後的連結串列。 示例: 給定1->2->3->4, 你應該返回2->1->4->3. 說明: 你的演算法只能使用常數

LeetCode 24 — Swap Nodes in Pairs(兩兩交換連結串列的節點)

Given a linked list, swap every two adjacent nodes and return its head. Example: Given 1->2->3->4, you should return the l

[LeetCode]24. Swap Nodes in Pairs兩兩交換鏈表的節點

strong code linked 我們 nodes ace use style value Given a linked list, swap every two adjacent nodes and return its head. Example: Given

[LeetCode]24. Swap Nodes in Pairs兩兩交換連結串列的節點

Given a linked list, swap every two adjacent nodes and return its head. Example: Given 1->2->3->4, you should return the list as

LeetcodeSwap Nodes in Pairs in JAVA 難得的次寫對不帶改的。。附贈測試程式like always

Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the

leetcode--(24. Swap Nodes in Pairs)

app modify spa ext div not != -- algorithm 描述: Given a linked list, swap every two adjacent nodes and return its head. For example,Given

[leetcode]24. Swap Nodes in Pairs交換鏈表的節點

運行 鏈表 log tle first body blog 交換 ext 感覺這個題後臺的運行程序有問題,一開始自己想的是反轉鏈表那道題的方法,只是隔一個節點執行一次,但是沒有通過,TLE了,但是很奇怪,並沒有死循環,就是最後返回的時候超時。 最後的思路就是很簡單的進行交換

LeetCode 24 Swap Nodes in Pairs

next 頭結點 code pair turn || lis AS urn public class SwapNodesInPairs { /** * Definition for singly-linked list. * public cl

leetcode#24 Swap Nodes in Pairs

null cpp 循環 def 使用 class ret 內部 2個 給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換後的鏈表。 示例: 給定 1->2->3->4, 你應該返回 2->1->4->3. 說明: 你的算法只能使用常數的額外

LeetCode Day21 Swap Nodes in Pairs

法一: class Solution { public: ListNode* swapPairs(ListNode* head) { if(head==NULL || head->next==NULL) return head; ListNo

[LeetCode] 24. Swap Nodes in Pairs

題:https://leetcode.com/problems/swap-nodes-in-pairs/description/ 題目 Given a linked list, swap every two adjacent nodes and return its head.

leetcode-24. Swap Nodes in Pairs

題目型別:連結串列 題意: 給出一個連結串列,按對交換節點, - 常數空間 - 不能用改變節點的值的方法做,需要交換節點本身。 我的思路:迭代。兩兩交換,修改next等指標 效率:10% 對於當前節點first,和下一個節點second - 記錄上一次

LeetCode--24. Swap Nodes in Pairs

題目連結:https://leetcode.com/problems/swap-nodes-in-pairs/ 思路類似於逆轉單鏈表(https://blog.csdn.net/To_be_to_thought/article/details/83930978)找出迴圈不變式 思路具體如圖:

[leetcode]24. Swap Nodes in Pairs

這題感覺沒什麼怎麼就medium了。 臨時加上一個空的頭結點,方便迴圈處理。 ListNode m=new ListNode(-1); m.next=head; head=m; m是要交換的兩個節點的前驅 p是要交換

python leetcode 24. Swap Nodes in Pairs

class Solution(object): def swapPairs(self, head): """ :type head: ListNode :rtype: ListNode """ ans=

leetcodeSwap Nodes in Pairs

題目: Given a linked list, swap every two adjacent nodes and return its head. Example: Given 1->2->3->4, you should return the l

leetcode-24-Swap Nodes in Pairs

The problem I did is very simple and clearly, which is seems stupid. I just point out its next point, next’s next point, and next’s next’s next

LeetCode 24 Swap Nodes in Pairs (C,C++,Java,Python)

Problem: Given a linked list, swap every two adjacent nodes and return its head. For example, Giv