news 2026/5/6 10:55:09

【剑斩OFFER】算法的暴力美学——两两交换链表中的结点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【剑斩OFFER】算法的暴力美学——两两交换链表中的结点

一、题目描述

二、算法原理

思路:引入哨兵位 + 3 个指针

为什么要引入哨兵位?当我们实现完第一次交换时:

prev 的 next 要指向 cur ,所以引入哨兵位,这样一次循环就能搞定交换两两结点;这里我为什么要引入 nnext ?其实是为了方便对两个结点时的交换。

循环结束的条件:

当结点为偶数时:next == nullptr 就结束循环

当结点为奇数时:cur == nullptr 就结束循环

三、代码实现

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* swapPairs(ListNode* head) { if(head == nullptr || head->next == nullptr) return head; ListNode* prev = new ListNode(0,head); ListNode* cur = head,*next = head->next,*nnext = next->next,*ret = next; while(cur && next) { next->next = cur; cur->next = nnext; prev->next = next;//对交换后的结点进行连接 prev = cur;//开始更新 cur 、prev 、 next 、nnext cur = nnext; if(cur) next = cur->next; else break; if(next) nnext = next->next; } return ret; } };

探索性代码:

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* swapPairs(ListNode* head) { ListNode* ret = nullptr; if(head == nullptr || head->next == nullptr) return head; else ret = head->next;//保存第一次交换的头结点 ListNode* prev = head; ListNode* cur = head->next; ListNode* tmpnode = nullptr; ListNode* swapnode = nullptr;//保存交换后的prev while(cur != nullptr)//使用临时变量来进行两两交换 { tmpnode = cur->next; cur->next = prev; prev->next = tmpnode; if(swapnode) swapnode->next = cur;//第二次,两两交换时,要把 prev 前一个结点链接上交换后的 cur swapnode = prev; prev = tmpnode; if(prev) cur = prev->next; else break; } return ret; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 6:57:42

基于腾讯元器搭建智能体“图片素材大师”Agent智能体搭建笔记

本文系统梳理基于腾讯元器平台构建“图片素材大师”智能体的全流程实操要点,涵盖前期需求锚定、核心功能搭建、图片检索工具集成、测试优化及运维保障等关键环节。该智能体采用单Agent架构开发,核心定位为“自然语言驱动的图像素材搜寻专家”&#xff0c…

作者头像 李华
网站建设 2026/5/5 9:24:39

【Kubernetes】K8s 1.35 配置 Docker 作为容器运行时

Kubernetes 1.24 移除了对 Docker 的直接支持,并且新版 K8s 主推更轻量的 Containerd,但 Docker 凭借其强大的生态依然是许多人的首选。本文将通过 cri-dockerd 这个 ‘适配器’,让 Kubernetes 中重新用上 Docker!操作系统&#x…

作者头像 李华
网站建设 2026/5/5 20:37:10

JAVA final 详解

1. 核心答案1.1 final方法可以重载吗?✅ 可以重载。final修饰的方法可以被重载。1.2 final方法可以重写吗?❌ 不能重写。final修饰的方法不能被重写(覆盖)。2. 详细解释2.1 为什么final方法可以被重载?重载&#xff08…

作者头像 李华
网站建设 2026/5/2 21:10:47

Java 线程生命周期详解

1. 线程状态概述Java 线程在其生命周期中有 6 种状态,定义在 java.lang.Thread.State 枚举中:public enum State {NEW, // 新建RUNNABLE, // 可运行BLOCKED, // 阻塞WAITING, // 等待TIMED_WAITING, // 计时等待TERMINATED …

作者头像 李华
网站建设 2026/5/3 6:33:55

Synchronized 详解及 JDK 版本优化

1. Synchronized 基础1.1 Synchronized 的使用方式1.1.1 修饰实例方法public class SynchronizedMethod {// 修饰实例方法,锁是当前实例对象(this)public synchronized void instanceMethod() {// 临界区代码System.out.println("实例方法锁");} }1.1.2 修…

作者头像 李华