24. 两两交换链表中的节点

    科技2024-11-10  9

    给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

    你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

    示例:

    给定 1->2->3->4, 你应该返回 2->1->4->3.

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    迭代解法 这道题很基础,不难,需要明白的就是背后的逻辑, 在我自己的想法就是,一定要保证的是交换两个节点调度前后节点不能丢失。那么就一定得知道交换节点前一节点的前一节点 0->1->2->3 要交换1和2,那么先断开0和1,0.next = 1.next 此时 0->2 1->2->3,这个时候没有让0丢失 接着要做的事就是,保留后一节点的值,那么 1.next = 2.next 此时 0->2 1->3 2->3 最后就是断开2和3,让2和1相连,那么 2.next = 1 此时 0->2->1->3 交换完成 然后将哑节点置成1节点,接着做同一件事 下面是我的代码

    class Solution { public ListNode swapPairs(ListNode head) { ListNode dummy = new ListNode(0); dummy.next = head; ListNode node = dummy; swap(node); return dummy.next; } private void swap(ListNode dummy) { ListNode tmp = dummy.next; if (dummy.next != null && dummy.next.next != null) { dummy.next = tmp.next; tmp.next = dummy.next.next; dummy.next.next = tmp; if (tmp.next != null && tmp.next.next != null) { dummy = dummy.next.next; swap(dummy); } else return; } } }

    递归解法 递归解法比迭代解法更妙 首先递归到尾结点,所以不需要管哑节点。但在思考这种解法的就有一个问题,既然是两两交换,那么如果节点数是单数,这就会抛出空指针,这个时候该怎么处理。 这个问题确实该考虑,但官方解答很巧妙的避开了这个问题,在每次递归之前先判断这是不是成对的节点,如何判断,和我用的方法一样,判断node和node.next两者是否有一者为空。

    class Solution { public ListNode swapPairs(ListNode head) { if (head == null || head.next == null) { return head; } ListNode first = head; ListNode second = head.next; first.next = swapPairs(second.next); second.next = first; return second; } }
    Processed: 0.014, SQL: 8