力扣 - 24. 两两交换链表中的节点

Posted linzedian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣 - 24. 两两交换链表中的节点相关的知识,希望对你有一定的参考价值。

题目

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

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

示例:

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

思路1

链表可以创建一个头结点来辅助解题,再创建一个指针指向头结点(该指针是把链表连起来用的),然后按照1指向3、2指向1完成交换,指针也下移两位,一直循环,直到刚好交换完或者剩下一个结点时候结束循环,完成交换

代码实现

class Solution {
    public ListNode swapPairs(ListNode head) {
        //链表一般可以考虑创建一个头结点来辅助解题
        ListNode newHead = new ListNode(-1);
        ListNode cur = newHead;
        //将头指针指向下一个要排序的head
        cur.next = head;

        //刚好交换完或者剩下一个结点时候结束循环
        while (head != null && head.next != null) {
            //改变指针指向交换后的左结点
            cur.next = head.next;
            
            //进行交换
            head.next = head.next.next;
            cur.next.next = head;
            
            //两个指针都移动后两位
            cur = head;
            head = head.next;
        }
        //返回第一个结点
        return newHead.next;
    }
}

思路2

递归实现,下一次递归传递的是要交换的第一个结点,若还有结点,就继续递归。我们可以从后往前看,将交换完的链表返回给前一个调用该函数的他的next,然后依次推导,最后返回头结点(注意,返回的要是第二个结点,因为第一个结点和第二个结点交换完后第二个就变成了第一个结点了

代码实现

class Solution {
    public ListNode swapPairs(ListNode head) {
        //刚好交换完或者剩下一个结点时候结束递归
        if (head == null || head.next == null) {
            return head;
        }

        //用来记录第二个结点的
        ListNode p1 = head.next;
        //第一个结点的下一个为交换好后的链表
        head.next = swapPairs(p1.next);
        //必须要放到执行swapPairs函数后面执行,否则如果先执行,那么函数里面的p1.next就指错了,造成栈溢出
        p1.next = head;
        return p1;
    }
}

以上是关于力扣 - 24. 两两交换链表中的节点的主要内容,如果未能解决你的问题,请参考以下文章

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

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

链表

24链表-两两交换链表中的结点

24链表-两两交换链表中的结点

两两交换链表中的节点