首页 > 其他分享 >24. 两两交换链表中的节点——学习笔记

24. 两两交换链表中的节点——学习笔记

时间:2023-03-25 22:37:39浏览次数:53  
标签:24 ListNode cur val next 链表 firstNode 节点

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

示例 1
img

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2

输入:head = []
输出:[]

示例 3

输入:head = [1]
输出:[1]

提示

  • 链表中节点的数目在范围 [0, 100] 内
  • 0 <= Node.val <= 100

题目来源:力扣(LeetCode)链接

题解

  • 迭代法
    /**
    * Definition for singly-linked list.
    * public class ListNode {
    *     int val;
    *     ListNode next;
    *     ListNode() {}
    *     ListNode(int val) { this.val = val; }
    *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    * }
    */
    class Solution {
        public ListNode swapPairs(ListNode head) {
            ListNode dummyNode = new ListNode(-1);
            dummyNode.next = head;
            ListNode cur = dummyNode;
            ListNode temp;
            ListNode firstNode;
            ListNode secondNode;
            while(cur.next != null && cur.next.next != null) {
                temp = cur.next.next.next;
                firstNode = cur.next;
                secondNode = cur.next.next;
                cur.next = secondNode;
                sceondNode.next = firstNode;
                firstNode.next = temp;
                cur = firstNode;
            }
            return dummyNode.next;
        }
    }
    
  • 递归法
    /**
    * Definition for singly-linked list.
    * public class ListNode {
    *     int val;
    *     ListNode next;
    *     ListNode() {}
    *     ListNode(int val) { this.val = val; }
    *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    * }
    */
    class Solution {
        public ListNode swapPairs(ListNode head) {
            ListNode firstNode = head;//这里一定firstNode是为了方便理解递归
            //如果头节点为空,或者遍历到链表的最后就返回该节点
            if (firstNode == null || firstNode.next == null) {
                return firstNode;
            }
            ListNode secondNode = firstNode.next;//要交换的第二个节点
            //递归开始,输入一组的第一个节点,返回这一组第二个节点
            //也就是前一组交换后要指向的下一组的第一个节点
            ListNode secondNextNode = swapPairs(secondNode.next);
            secondNode.next = firstNode;//第二个节点和第一个节点交换位置
            //交换位置后的第二个节点指向下一组交换后的第一个节点
            firstNode.next = secondNextNode;
            return secondNode;//返回交换后的第一个节点
            //递归完成后会回溯到第一次交换的位置,返回的就是整个链表交换后的头节点
        }
    }
    

标签:24,ListNode,cur,val,next,链表,firstNode,节点
From: https://www.cnblogs.com/benben-home/p/17255521.html

相关文章

  • 206.反转链表——学习笔记
    题目:给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:hea......
  • 707.设计链表——学习笔记
    题目:你可以选择使用单链表或者双链表,设计并实现自己的链表。单链表中的节点应该具备两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果......
  • 142.环形链表II——学习笔记
    题目:给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。......
  • 面试题 02.07. 链表相交——学习笔记
    题目:给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。图示两个链表在节点c1开始相交:题目数据保......
  • 19.删除链表的倒数第N个节点——学习笔记
    题目:给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=[1],n=1输出:[]示例3:......
  • 自己动手从零写桌面操作系统GrapeOS系列教程——24.加载并运行loader
    学习操作系统原理最好的方法是自己写一个简单的操作系统。之前我们在电脑的启动过程中介绍过boot程序的主要任务就是加载并运行loader程序,本讲我们就来实现。本讲代码......
  • 二叉搜索树中两个节点之和
    题目描述给定一个二叉搜索树的根节点root和一个整数k,请判断该二叉搜索树中是否存在两个节点它们的值之和等于k。假设二叉搜索树中节点的值均唯一。参考leetcode......
  • java——spring boot集成kafka——单节点示例
    首先安装一个zk。然后再安装kafka:   执⾏以下命令创建名为“test”的topic,这个topic只有⼀个partition,并且备份因⼦也设置为1: 然后在kafka节点下,执行如下命令:......
  • [FastAPI-24]jsonable_encoder 序列化
    importtypingimportjsonfromfastapiimportFastAPI,Responsefromfastapi.encodersimportjsonable_encoderfromdatetimeimportdatetimefrompydanticimpor......
  • 2023-03-25 单链表LinkList的基本操作
    1#include<stdio.h>2#include<stdbool.h>3#include<malloc.h>4typedefstructLNode5{6intdata;7structLNode*next;8}LNod......