力扣鏈接: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; } }
怎么樣,模擬以后是不是感覺簡單很多了,很多題目需要自己動手去嘗試!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/539162.html
標籤:其他
上一篇:探索Git內部原理
下一篇:力扣刷題01
