当前位置:   article > 正文

链表_两两交换链表中的节点_swap语句交换链表节点

swap语句交换链表节点

Leet024

该题目源自LeetCode 024题。
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

思路

有两个思路去解这道题

虚拟节点

构建一个虚拟节点,然后看下面的图去写代码,就比较容易了。
来自代码随想录的插图

public ListNode swapPairs(ListNode head){
        ListNode dummyNode = new ListNode(0);
        dummyNode.next = head;
        ListNode prev = dummyNode;

        while (prev.next != null && prev.next.next != null){
            ListNode temp = head.next.next;
            prev.next = head.next; //在第一次交换中,代表将虚拟节点的下一个,从指着头节点到指着头节点的下一个
            head.next.next = head;//在第一次交换中,代表将头节点的下一个的指针指向头节点,也就是图中的2指向1
            head.next = temp;//在第一次交换中,头节点指向图中的3
            prev = head;//图中的1,原本的头节点成为下一次交换的prev
            head = head.next;//原本头节点指向的节点,图中的3成为了新的头节点,然后继续循环下去,知道全部完成。
        }
        return dummyNode.next;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

递归

//递归的方法没有构建虚拟节点,但是也很好理解
public ListNode swapPairs2(ListNode head){
        if (head == null || head.next == null)return head;
        ListNode next = head.next;
        ListNode newNode = swapPairs2(next.next);
        next.next = head;// 第1次交换中,第二个节点指向第一个节点
        head.next = newNode;//第一个节点指向后面的节点
        return next;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/数据挖掘灵魂/article/detail/61249
推荐阅读
相关标签
  

闽ICP备14008679号