LeetCode24—两两交换链表中的节点
老规矩,先贴个人代码(看了标准答案的代码总觉得自己的代码…不可描述)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
public class Leetcode_24 {
public ListNode swapPairs(ListNode head) { if(head == null) return null; ListNode pre = new ListNode(-1); ListNode node1 = pre; pre.next = head; ListNode node2 = head; ListNode node3 = head.next; while(node1!=null&&node2!=null&&node3!=null){ node2.next = node3.next; node3.next = node2; node1.next = node3; node1 = node1.next.next; node2 = node2.next; if(node3.next.next==null){ break; } else { node3 = node3.next.next.next; } } return pre.next; } public static void main(String[] args) { Leetcode_24 leetcode_24 = new Leetcode_24(); ListNode node0 = null; ListNode node1 = new ListNode(1); ListNode node2 = new ListNode(2); ListNode node3 = new ListNode(3); ListNode node4 = new ListNode(4); ListNode node5 = new ListNode(5); ListNode node6 = new ListNode(6); ListNode node7 = new ListNode(7); ListNode node8 = new ListNode(8); ListNode node = leetcode_24.swapPairs(node0); while (node != null) { System.out.print(node.val + " "); node = node.next; } System.out.println(""); } }
|
本题我使用的是迭代的方法,首先是创建一个头节点,它的下一个节点用来存储生成新链表的头节点,同时,因为要交换两个节点,所以肯定需要一个节点来存储交换节点前面节点的前驱节点。
比如要交换节点1和2.我们就可以假象前面有一个节点0,这个节点0就是1的前驱节点,可以让这三个节点同时向后移动两个单位,再次进行节点交换,直到节点1为空或者节点2为空为止。
从解法上看,只需要遍历一次链表既可以完成数据交换,所以算法的时间复杂度为O(1)。
官方解法
迭代的思路和我一致,这里不再赘述。
递归解法
1 2 3 4 5 6 7 8 9 10 11
| 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; } }
|
先贴上图示:
递归的解法:首先第一步让前节点指向两个交换节点的后一个节点,这是递,然后第二步,让被交换的第二个节点指向交换的第一个节点,这是归,从这一思想我们可以总结出,返回值就是next,而且已经是被处理好的(交换好的)。
这个递归解法就我个人而言还是挺难想到的,还是缺少练习,继续努力!