1. 程式人生 > 其它 >兩兩交換連結串列中的節點-LeetCode24模擬節點

兩兩交換連結串列中的節點-LeetCode24模擬節點

力扣連結:https://leetcode.cn/problems/swap-nodes-in-pairs/

題目

給你一個連結串列,兩兩交換其中相鄰的節點,並返回交換後連結串列的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能進行節點交換)。

示例1:

          

輸入:head = [1,2,3,4]
輸出:[2,1,4,3]

示例2:

輸入:head = []
輸出:[]

示例3:

輸入:head = [1]
輸出:[1]

當拿到這個題目,我相信很多人跟我一樣,比較矇蔽了,這怎麼交換啊?這個題目需要去模擬,待我一一來分析。

思路

    建議使用虛擬頭結點,這樣會方便很多,要不然每次針對頭結點(沒有前一個指標指向頭結點),還要單獨處理。接下來就是交換相鄰兩個元素了,此時一定要畫圖,不畫圖

,操作多個指標很容易亂,而且要操作的先後順序初始時,cur指向虛擬頭結點,然後進行如下三步(來自程式碼隨想錄):

        

     操作之後,連結串列如下:

     

     看這個可能就更直觀一些了:

     

    看完這個過程是不是理解很多了,本人也是。

    由此我們可以寫出我們的程式碼:

  class Solution {     public ListNode swapPairs(ListNode head) {         ListNode dm=new ListNode(0);         dm.next=head;         ListNode curr=dm;         while(curr.next!=null && curr.next.next!=null){             ListNode temp1=curr.next;             ListNode temp2=curr.next.next.next;             curr.next=curr.next.next;             curr.next.next=temp1;             curr.next.next.next=temp2;             curr=curr.next.next;         }         return dm.next;     } }

    首先我們先建立一個虛擬頭結點

,然後定義一個curr節點指定這個虛擬頭結點。然後判斷該節點後兩個節點是否為空,不為空可以開始交換了。先用兩個變數記住圖中1,3節點,按照上面交換進行,curr指向2節點,2節點指向1節點,1節點指向3節點,最後將當前節點位置向後移動兩位,就可以開始交換下兩個節點的位置了。

    其實還有遞迴方法可以解決,程式碼如下:

class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        ListNode next 
= head.next; head.next = swapPairs(next.next); next.next = head; return next; } }

    怎麼樣,模擬以後是不是感覺簡單很多了,很多題目需要自己動手去嘗試!!!