码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-11-11 15:43:06      阅读:6      评论:0      收藏:0      [点我收藏+]

标签:头结点   题目   tno   执行   推导   传递   node   ||   header   

题目

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

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

示例:

给定 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. 两两交换链表中的节点

标签:头结点   题目   tno   执行   推导   传递   node   ||   header   

原文地址:https://www.cnblogs.com/linzedian/p/13763596.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!