乘風破浪:LeetCode真題_024_Swap Nodes in Pairs
阿新 • • 發佈:2019-01-04
應該 tno http sin highlight 怎麽 算法 bsp def
乘風破浪:LeetCode真題_024_Swap Nodes in Pairs
一、前言
這次還是鏈表的操作,不過我們需要交換鏈表奇數和偶數位置上的節點,因此要怎麽做呢?
二、Swap Nodes in Pairs
2.1 問題
要求是不能修改節點的元素,並且使用的空間也是常數級別的,不能使用更高的內存空間。
2.2 分析與解決
通過分析我們可以使用簡單的遍歷算法,通過四個指針來解決,當然我們也可以使用遞歸算法來解答。
使用正常遍歷算法:
public class Solution { /** * 題目大意 * 給定一個單鏈表,成對交換兩個相鄰的結點。算法法應該做常量輔助空間,不能改結點的值,只能交換結點。 * * 解題思路 * 使用一個頭結點root來輔助操作,對要進行交換的鏈表,每兩個的位置進行交換, * 並且把交換後的結點接到root的鏈表上,直到所有的結點都處理完。 */ public ListNode swapPairs(ListNode head) { ListNode node = new ListNode(0); // 頭結點 node.next = head; // p指向新的鏈表的尾結點 ListNode p = node; ListNode tmp; // 每兩個進行操作 while (p.next != null && p.next.next != null) { // 記錄下一次要進行處理的位置 tmp = p.next.next; // 下面三句完成兩個結點交換 p.next.next = tmp.next; tmp.next = p.next; p.next = tmp; // 指向返回鏈表的新的尾結點 p = tmp.next; } head = node.next; node.next = null; return head; } }
使用遞歸方法:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode swapPairs(ListNode head) { if (head == null || head.next == null) return head; ListNode second = head.next; ListNode third = second.next; second.next = head; head.next = swapPairs(third); return second; } }
三、總結
遇到這樣的問題,我們可以從多個角度去考慮,找到便於理解並且可行的算法。
乘風破浪:LeetCode真題_024_Swap Nodes in Pairs