首页 > 其他分享 >反转链表

反转链表

时间:2024-07-22 20:18:16浏览次数:12  
标签:pre ListNode val int 反转 next 链表 curr

注意:反转结束后,从原来的链表上看,\(pre\) 指向反转这一段的末尾,\(cur\) 指向反转这一段后续的下一个节点。

206.反转链表

/**
 * 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* reverseList(ListNode* head) {
        ListNode* pre = nullptr, *curr = head;
        while (curr) {
            ListNode* nxt = curr->next;
            curr->next = pre;
            pre = curr;
            curr = nxt;
        }
        return pre;
    }
};

92.反转链表Ⅱ

/**
 * 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* reverseBetween(ListNode* head, int left, int right) {
        ListNode *dummy = new ListNode(0, head), *p0 = dummy;//left 为 1 时没有上一个节点,因此要维护一个哨兵节点
        for (int i = 0; i < left - 1; i++) p0 = p0->next;//结束时 p0 指向 left 的上一个节点

        ListNode *pre = nullptr, *cur = p0->next;
        for (int i = 0; i < right - left + 1; i++) {
            ListNode* nxt = cur->next;
            cur->next = pre;
            pre = cur;
            cur = nxt;
        }
        
        p0->next->next = cur;
        p0->next = pre;
        return dummy->next;
    }
};

25.K个一组翻转链表

/**
 * 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* reverseKGroup(ListNode* head, int k) {
        ListNode* cur = head;
        int len = 0;
        while (cur) {
            len++;//计算链表长度
            cur = cur->next;
        }
        ListNode *dummy = new ListNode(0, head), *p0 = dummy;
        ListNode *pre = nullptr, *curr = head;
        while (len >= k) {//剩余元素比 k 大就反转链表节
            len -= k;
            for (int i = 0; i < k; i++) {
                ListNode *nxt = curr->next;
                curr->next = pre;
                pre = curr;
                curr = nxt;
            }
            ListNode *nxt = p0->next;
            p0->next->next = curr;
            p0->next = pre;
            p0 = nxt;
        }
        return dummy->next;
    }
};

标签:pre,ListNode,val,int,反转,next,链表,curr
From: https://www.cnblogs.com/pangyou3s/p/18316814

相关文章

  • 【数据结构】:链表实现洗牌功能
    此操作包含的基本功能有:组牌:组建52张扑克牌四种花色:“♥️”,“♠️”,“⬛️”,“♣️”每种花色13张牌:1~13洗牌:将52张扑克牌打乱顺序发牌:给三个人每人发5张牌扩展功能:清牌:将每人手中牌按照面值进行从大到小排序Card类在此类中,我们将完成对每一张牌的构造类......
  • 如何使用 Python 自动反转 .cal 和 .GP4 图像文件中的颜色?
    我在.cal和.GP4中有数千个计划,我需要反转其颜色(当它们处于“负”时切换到“正”模式)。我知道可以在像autocad这样的软件中一一完成,但出于明显节省时间的原因,我正在寻找一种批量处理方法。我创建了一个Python程序来执行该操作,但先验有没有允许轻松操作.cal和.GP4......
  • 手撕数据结构01--单链表(附源码)
    目录1.链表的概念和结构1.1链表的概念1.2单链表结构2.实现单链表2.1节点定义2.2链表功能2.3 创建节点2.4尾插2.5头插2.6打印2.7尾删2.8头删2.9查找2.10指定位置插入2.11指定位置之后插入2.12删除pos节点2.13删除pos之后的节点2.14销毁链表......
  • Verilog队列链表操作
    链表在缓存管理中有重要的应用,对所有输入的数据都放在一块大的RAM中缓存,并且根据一定的规则将数据分类并划归不同的队列,不同队列的数据可以分别控制输出,队列内,数据按严格先进先出的顺序操作我们假设输入数据的位宽为256,并且开辟一个2^20深度的RAM用于缓存,那么RAM大小为32MB。将......
  • 教你如何手撕双向链表
    1.双向链表1.1概念与结构注意:这⾥的“带头”跟前⾯我们说的“头结点”是两个概念,实际前⾯的在单链表阶段称呼不严谨,但是为了同学们更好的理解就直接称为单链表的头结点。带头链表⾥的头结点,实际为“哨兵位”,哨兵位结点不存储任何有效元素,只是站在这⾥“放哨......
  • (算法)合并两个有序链表————<递归>
    1.题⽬链接:21.合并两个有序链表 2.题⽬描述: 3.解法(递归):算法思路:1.递归函数的含义:交给你两个链表的头结点,你帮我把它们合并起来,并且返回合并后的头结点;2.函数体:选择两个头结点中较⼩的结点作为最终合并后的头结点,然后将剩下的链表交给递归函数去处理;3.递归出......
  • day1-数组和链表
    力扣704.二分查找给定一个n个元素的有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回小标,否则返回-1。思路:二分查找法,定义左右边界[left,right);不断取中值缩小查找范围。classSolution{publicintsearch(int[]nums,int......
  • 代码随想录训练营 Day4打卡 链表part02 24. 两两交换链表中的节点 19.删除链表的倒数
    代码随想录训练营Day4打卡链表part02一、力扣24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]算法思路:引入虚......
  • 《算法笔记》总结No.10——链表
        从第10期破例插叙一期单链表的实现,这个东东相当重要!考研的同学也可以看:相较于王道考研的伪码不太相同,专注于可以运行。如果是笔试中的伪码,意思正确即可~ 注:博主之前写过一个版本的顺序表和单链表的C++实现,和这篇的写法有所不同,不过内容也较全,大家可以先行阅读~......
  • 初阶数据结构的实现2 双向链表
    1.双向链表1.1概念与结构1.2实现双向链表1.2.1定义程序目标#define_CRT_SECURE_NO_WARNINGS1#pragmaonce#include<stdio.h>#include<assert.h>#include<stdlib.h>#include<stdbool.h>typedefintLTDateType;//定义双向链表结构typedefstructListNode{......