资讯动态

030两两交换链表中的节点

发布时间:2026/8/20 8:58:27 来源:尧图企业网站定制
两两交换链表中的节点题目链接https://leetcode.cn/problems/swap-nodes-in-pairs/description/?envTypestudy-plan-v2envIdtop-100-liked我的解答public ListNode swapPairs(ListNode head) { if(headnull||head.nextnull){ return head; } ListNode dummy new ListNode(-1,head); ListNode predummy; ListNode lefthead, righthead.next; while(right!null){ left.nextright.next; right.nextleft; pre.nextright; preleft; leftleft.next; if(left!null){ rightleft.next; } else{ rightnull; } } return dummy.next; }分析代码的时间复杂度为O(n)空间复杂度为O(1)。解题思路在链表头节点添加一个哑节点避免单独处理边界情况。使用三个指针left和right为当前交换的一对左右节点pre为当前交换的一对节点的前置节点。每次先将左右节点进行交换然后更改前置节点的下一个节点移动时先移动pre再移动left和right。看了官方题解后的解答//方法一递归 //实践复杂度O(n) //空间复杂度O(n) public ListNode swapPairs(ListNode head) { if(headnull||head.nextnull){ return head; } ListNode newHeadhead.next; head.nextswapPairs(newHead.next); newHead.nexthead; return newHead; } //方法二迭代 //实践复杂度O(n) //空间复杂度O(1) public ListNode swapPairs(ListNode head) { ListNode dummyHead new ListNode(-1,head); ListNode predummyHead; ListNode node1, node2; while(pre.next!nullpre.next.next!null){ node1pre.next; node2pre.next.next; node1.nextnode2.next; node2.nextnode1; pre.nextnode2; prenode1; } return dummyHead.next; }分析​ 1、方法一采用递归。链表节点两两一组进行交换若一组节点不足两个则不用交换直接返回。不断递归交换每一组节点每一次递归交换完成后返回新的头节点作为上一组交换完成后第二个节点的后置节点。​ 2、方法二采用迭代。添加一个哑节点避免单独处理边界情况temp作为每一组交换节点的前置节点根据temp定位两个需要交换的节点然后交换指针使得节点关系从temp—node1—node2变为temp—node2—node1再令tempnode1即可定位下一组进行交换的节点重复此过程直到不存在节点或者只剩一个节点。​ 3、我的解答思路与官方解答的方法二一致只不过实现上有所出入。总结本题可以采用递归和迭代两种方法。递归每次返回每组交换后节点的第一个节点连接到上一组交换后第二个节点的末尾即可。迭代通过前置节点定位一组进行交换的两个节点然后更改节点之间关系直到不存在节点或者只剩一个节点。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价