首页 > 其他分享 >Leetcode24. 两两交换链表中的节点

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

时间:2023-10-17 22:47:50浏览次数:42  
标签:head ListNode cur next 链表 Leetcode24 null 节点

题目描述

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

示例

image

提交的代码

class Solution {

    ListNode nextNode;

    public ListNode swapPairs(ListNode head) {
        //特殊化处理空链表
        if(head==null)return head;
        return recursiveSwap(head,head.next);
    }

    public ListNode recursiveSwap(ListNode pre,ListNode cur){
        //处理奇数链表最后一个的情况
        if(cur==null){
            return pre;
        }

        nextNode=cur.next;

        cur.next=pre;
        pre.next=nextNode;

        //处理偶数链表最后两个的情况
        if(nextNode==null)return cur;
        pre.next=recursiveSwap(nextNode,nextNode.next);
        return cur;
    }
}

个人使用的是递归的方式来实现的,思想就是当前递归层中的两个节点,后一个节点指向前一个节点,而前一个节点暂时指向后一个节点原来的后驱(这个后驱需要用额外的变量记录)。
这里的暂时指的是:如果下个递归层还能够处理的话,下个递归层返回的节点供给前一个节点的next来指向。这里返回的节点是有情况的,如果下个递归层还够两个节点的话,那么返回的节点就是交换过的节点中的cur,如果下个递归层不够两个:1.最后一个了,那么就直接返回pre 2.上一层处理的就是最后的两个,下个递归层是没有节点了的,那么这个时候之前的暂时就起到作用了,pre指向为null,并且当前递归层返回的是cur。

学习到的方法

image
这里需要使用虚头来完成代码的编写,统一插入操作。当然,不用虚头也可以,麻烦点。
需要使用到指针来指向需要交换的两个节点中的第一个节点的前驱,并且还要使用额外的空间来记录第一个节点和第三个节点的内存地址(因为要交换,可以大脑构思一下),接下来的操作就是如下。

class Solution {
    ListNode first;
    ListNode third;
    
    public ListNode swapPairs(ListNode head) {
        //先行处理空节点
        if(head==null)return null;
        //使用虚头来处理,因为涉及到插入,统一插入操作。当然,不使用虚头也能做
        ListNode fakeHead=new ListNode(-1,head);
        ListNode cur=fakeHead;
        while(cur.next!=null&&cur.next.next!=null){
            first=cur.next;
            third=cur.next.next.next;

            //开始交换
            cur.next=cur.next.next;
            cur.next.next=first;
            first.next=third;

            //cur跟进到要交换的两个节点中第一个节点的前驱
            cur=cur.next.next; 
        }
        return fakeHead.next;
    }
}

标签:head,ListNode,cur,next,链表,Leetcode24,null,节点
From: https://www.cnblogs.com/whitePuPigeon/p/17770898.html

相关文章

  • 十天学完基础数据结构-第四天(链表(Linked List))
    链表的基本概念链表是一种线性数据结构,与数组不同,链表的元素(节点)之间通过指针相互连接。链表有以下基本概念:节点:链表中的每个数据项称为节点,每个节点包含数据和一个指向下一个节点的指针。头节点:链表的第一个节点称为头节点,它通常用来表示整个链表的起始位置。尾节点:链表的最后一个......
  • 代码随想训练营第四天(Python)| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点
    两两交换链表中的节点关键点:涉及到头节点变动的都使用虚拟节点。画图找出交换节点指向的顺序和退出循环的条件。1、迭代法classSolution:defswapPairs(self,head:Optional[ListNode])->Optional[ListNode]:dummy_node=ListNode(next=head)cur=......
  • Day3 链表的一些基本练习
    Day3链表的基础练习最基本的删除节点Lc203我习惯的还是弄一个新的dummyhead,然后如果是要找的节点,就删除,删除完记得delete。//代码没什么好看的,主要就是熟悉链表的写法classSolution{public:ListNode*removeElements(ListNode*head,intval){ListNode......
  • Leetcode206. 反转链表
    题目描述给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例提交的代码classSolution{publicListNoderesultHead;publicListNodereverseList(ListNodehead){if(head==null)returnnull;ListNodefirst=recursionOfList(he......
  • java链表详解 理论+代码+图示
    1、定义链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。(即链表是一个个节点组成的,这些节点物理上不连续,但逻辑上连续)一个节点就是一个Node对象。2、链表结构单向、双向;带头、不带头;循环、非循环; 以上情况组......
  • 倾斜摄影三维模型的根节点合并的重要性分析
    倾斜摄影三维模型的根节点合并的重要性分析 倾斜摄影三维模型的根节点合并是整个模型构建过程中的一个重要环节,具有重要的意义和作用。本文将对倾斜摄影三维模型的根节点合并的重要性进行详细分析。一、定义和概述在倾斜摄影三维模型的构建过程中,根节点合并是指将不同块或区......
  • Leetcode707. 设计链表
    题目描述你可以选择使用单链表或者双链表,设计并实现自己的链表。单链表中的节点应该具备两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果是双向链表,则还需要属性prev以指示链表中的上一个节点。假设链表中的所有节点下标从0开始。实现M......
  • 代码随想训练营第三天(Python) | 203.移除链表元素、707.设计链表、206.反转链表
    一、203.移除链表元素关键点:如何删除节点,需要知道删除节点前的节点。1、无虚拟头节点的方法classSolution:defremoveElements(self,head:Optional[ListNode],val:int)->Optional[ListNode]:whilehead!=Noneandhead.val==val:#如果头节点的值......
  • Leetcode203.移除链表元素
    题目描述给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例提交的代码/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}......
  • 基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点
    1.程序功能描述    LEACH的原理在于它将传感器节点分为两类:簇头节点和普通节点。普通节点将数据发送给距离自己最近的簇头节点,然后簇头节点将收集到的数据融合后发送给基站。这种机制可以减少网络中节点的能耗,并且能够提高数据融合比例,减少传输数据量。本课题将分别对比le......