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

每日一练:LeeCode-24. 两两交换链中的节点链表+虚拟头结点】 LeeCode-19. 删除链表的倒数第 N 个结点【链表+虚拟头结点+双指针(快慢)】 给你一个链表两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 阅读详情

题目:

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

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
在这里插入图片描述

示例 1:

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

解题思路:

我们可以通过改变链表的指向来解决这道题。
我们以1->2->3->4为例。

在这里插入图片描述

  1. 定义一个新链表res.next指向原链表。
    在这里插入图片描述

  2. 因为两两交换涉及到三个节点,我们需要定义一个中间指针指向res方便返回修改后的链表,以及指向head节点、指向第二个节点的nxt、第三个节点的tem。
    在这里插入图片描述
    在这里插入图片描述

  3. 交换完链表后,移动上面的指针位置,重复上述操作。
    在这里插入图片描述

解题代码:

/**
 * 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) {
        //定义一个指针指向head
        ListNode res = new ListNode();
        res.next=head;

        ListNode cur=res;
        while (cur.next!=null&&cur.next.next!=null){
            ListNode nxt=head.next;
            ListNode tmp=nxt.next;
            //交换
            cur.next=nxt;
            nxt.next=head;
            head.next=tmp;
            
            //交换完之后移动位置
            cur=head;
            head=head.next;


        }
        return res.next;
    }
}
leecode 24】【两两交换链中的节点 leetcode 24 两两交换链中的节点 给定一个链表两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 输入:head = [1,2,3,4] 输出:[2,1,4,3] 解题思路: 暴力法通常需要创建一个新的链表头来存储结果,并因为需要做指针的交换,设置一个空节点去连接head是很有帮助的。这道题需要注意判断结束循环的条件,考虑链表节点个数是奇偶数的情况,理清楚交换指针的顺序。看下面动图 递归法不需要创建新结点,但是一定要搞清 阅读详情

相关推荐

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

Leecode 24. 两两交换链中的节点 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: ListNode* swapPairs(ListNode* head) { if (head == NULL || head -> next == NULL) {

w_shine93的博客 244

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

题目要求对链表中的相邻节点进行两两交换,不能修改节点值,只能通过改变指针实现。采用递归解法:每次处理前两个节点,交换它们的指向关系,然后递归处理剩余部分。示例输入[1,2,3,4]处理后变为[2,1,4,3]。空链表或单节点链表直接返回原链表。递归终止条件是当前节点为空或只有一个节点。时间复杂度O(n),空间复杂度O(n)(递归栈空间)。测试代码验证了该方案的正确性。

u012116089的博客 187

Leecode24:两两交换链中的节点

给定一个链表两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 输入:head = [1,2,3,4] 输出:[2,1,4,3] 示例 2: 输入:head = [] 输出:[] 示例 3: 输入:head = [1] 输出:[1] 提示: 链表节点的数目在范围 [0, 100] 内 0 <= Node.val <= 100 方法一:递归 思路与算法 1.可以通过递归的方式实现两两交换链中的节点。 2.递归的终止条件是

每天学习一点点,成长一小步 196

Leecode刷题之路第24天之两两交换链中的节点

代码示例:(Java)代码示例:(Java)代码示例:(Java)

工一木子 394

LeeCode24. 两两交换链中的节点

24. 两两交换链中的节点

LeeYotta的博客 543

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

声明好临时变量之后,第一个操作用来把rightNode的next结点交给leftNode的next结点.因为前三个结点的next都需要指向新的结点,而已经有临时变量存放它们的引用,所以优先把待会会被覆盖的rightNode,next放到正确的位置.这时候示意图长这样。原本以为链表是比较容易对付的知识点,但规模比较大的问题很容易在思考完成写代码的时候出现混乱,引发难以debug的问题.用画图这种更形象的方法可以比较有效的解决思路紊乱的问题.的移动,我们设置一个空结点重新作为头结点.交换的起点也是它.

Nico_Anzio的博客 644

leecode 24-两两交换链中的节点

从头开始让节点和下一个节点的值交换,然后让指针往后跳2次。要注意while循环里的条件,因为存在节点个数为单数的情况,所以除了平常的当前节点不为空外,还要判断下一个节点不为空才行。给你一个链表两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。链表节点的数目在范围 [0, 100] 内。输入:head = [1,2,3,4]输入:head = [1]输出:[2,1,4,3]输入:head = []以下是java代码实现。

qq_46440072的博客 534

Leecode-24.两两交换链中的节点(详细)

这里写自定义目录标题题目描述解题思路代码(Java实现) 题目描述 给定一个链表两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 解题思路 1、对于任意一个链表,如果链表的长度小于等于1,那么该链表就不必进行节点交换,直接return即可。 2、对于长度大于2的链表,从头开始,维护三个指针(java引用)p,q,r,前两个指针指向当前要

ProGramming_Mk的博客 260

leecode24. 两两交换链中的节点

24. 两两交换链中的节点 法一:迭代法。 使用虚拟头结点;用一个节点pre标记此时的头结点,在后面迭代时一直标记的当前需要翻转的节点的前一个节点;用一个节点temp标记首先翻转后的需要连接的节点。然后根据要求将前两个节点翻转,之后更新pre和head所示的节点位置,然后继续重复上述步骤。直到当前需要翻转的节点和next节点为空时,说明到达末尾了,结束迭代,返回虚拟头节点的下一个节点即为所得链表。 /** * Definition for singly-linked list....

maocaicai的博客 309

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

原题链接:Leecode 24. 两两交换链中的节点 class Solution { public: ListNode* swapPairs(ListNode* head) { if(head==nullptr || head->next==nullptr) return head; ListNode* tmp=head->next; ListNode* node=tmp->next; tmp

想买很多漂亮衣服但是买不起的博客 394

go语言LeeCode刷题记:24. 两两交换链中的节点

24. 两两交换链中的节点 给定一个链表两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3 答案: /** * Definition for singly-linked list. * type ListN...

Duan_YZ的博客 393

LeeCode2. 两数相加,LeeCode24. 两两交换链中的节点——完整步骤拆解(含注释)

本文包含两个LeetCode链表问题的解析:两数相加和两两交换链节点。 两数相加:通过模拟手工加法,从链表头部开始逐位相加并处理进位。使用哨兵节点简化操作,时间复杂度O(max(m,n)),空间复杂度O(max(m,n)+1)。 两两交换节点:提供迭代和递归两种解法。迭代法使用哨兵节点和前驱指针调整节点指向,递归法将问题分解为子问题处理。两种方法的时间复杂度均为O(n),迭代法空间O(1),递归法空间O(n)。 关键点在于理解链表逆序存储的特点、正确处理进位和边界条件,以及掌握指针操作技巧。

764

Leecode刷题笔记——24. 两两交换链中的节点

题目要求: 给定一个链表两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 思路如下: 1、两两交换,是一个重复的工作,可考虑采用递归 2、递归需要考虑的三个条件:第一,终止条件;第二、调用单元做了什么;第三、返回值。 3、需...

Tyxxxxxx 294

两两交换链中的节点LeeCode24

LeetCode24

cometo_bowl的博客 199

leecode算法《24. 两两交换链中的节点》详解有注释,简单明了。

leecode算法《24. 两两交换链中的节点》详解有注释,简单明了。 原题内容 给定一个链表两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 来源:力扣(LeetCode) 链接:https://leetcode-cn.co...

qq_35971301的博客 144

leecode10:24 两两交换链中的节点

注意条件的顺序 :不能反过来变成if(head->next == nullptr || head== nullptr)跟官方题解(在处理一对节点时,额外考虑和上一对的联系)在上一题(206)搞懂递归后,这道题就变的很简单。相反:在处理一对节点时,直接关联起下一对。(有三种情况,还是成对、单个、没有了)

2301_80116296的博客 22

【刷题实录之数组】leecode24. 两两交换链中的节点

这道题目正常模拟就可以了。建议使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。接下来就是交换相邻两个元素了,此时一定要画图,不画图,操作多个指针很容易乱,而且要操作的先后顺序。这个专栏主要是我在刷题的过程中总结的一些笔记,因为我学的也很一般,如果有错误和不足之处,还望大家在评论区指出。希望能给大家的学习带来一点帮助,共同进步!:给定一个链表两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

@啊哈哈哈哈哈韩的博客 246
上一篇: LeeCode-22-括号生成
下一篇: ElasticSearch
wangbeita
博客等级 码龄10年 9粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值