LeetCode - 24 - 两两交换链表中等的节点 - Java

Posted Dark And Grey

tags:

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

前言

对单链表还不熟悉的朋友,可以参考这篇文章顺序表 和 链表 - 单向链表部分

题目

这个题目不好讲,我直接将代码 和 解析图 给你们,需要你们自己多琢磨。当然一些重要代码部分我会注释一下!


递归解法

class Solution 
    public ListNode swapPairs(ListNode head) 
        if(head == null || head.next== null)
            return  head;
        
        ListNode newHead = head.next;
        head.next = swapPairs(newHead.next);
        newHead.next = head;
        return newHead;
    

代码解析图


迭代

class Solution 
    public ListNode swapPairs(ListNode head) 
        ListNode newHead = new ListNode();
        newHead.next = head;
        ListNode tmp = newHead;
        while(tmp.next!=null && tmp.next.next!=null)
            ListNode node1 = tmp.next;
            ListNode node2 = tmp.next.next;
            tmp.next = node2;
            node1.next = node2.next;
            node2.next = node1;
            tmp = node1;
        
        return newHead.next;
    

代码解析


还有一种方法 ,是通过 “栈的特性:先入后出,后进先出” 来实现了的


代码

class Solution 
    public ListNode swapPairs(ListNode head) 
        if(head == null || head.next == null)
            return head;
        
        Stack<ListNode> stack = new Stack<>();// 创建 栈
        ListNode p = new ListNode();// 新建一个节点
        ListNode cur =  head;// 创建 一个 head头节点替身,去遍历数组
        head = p;//  将 head 重新指向 一个 节点,也就是说上面cur成为了真正的头节点
        while(cur!=null && cur.next!=null)
            stack.add(cur);// 入栈
            stack.add(cur.next);// 入栈
            cur =  cur.next.next;// 旧链表的头节点 向后移动2位,旧链表的头节点不重要,丢了就丢了
            p.next = stack.pop();// 出栈, 将旧链表的两个节点"交换"后,原先的第二个节点取出。
            p = p.next; //将其接入 新链表当中
            p.next = stack.pop();// 出栈, 将 旧链表的两个节点"交换"后,原先的第一个节点取出。
            p= p.next;//将其接入 新链表当中
        
        if(cur!=null)// 节点为奇数的情况,那么需要将最后一个节点,接入新链表中
            p.next = cur;
        else// 节点为偶数的情况,那么需要将最后一个节点的next 置为 null
            p.next = null;
        
        return head.next;// 最后返回 头节点的next
    

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

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

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

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

leetcode24-两两交换链表图解

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

leetcode 24 - 两两交换链表中的节点