首页 > 其他分享 >反转链表系列图解

反转链表系列图解

时间:2023-08-04 16:07:07浏览次数:37  
标签:pre head ListNode cur 反转 next 链表 图解

1.反转链表

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

图解

反转链表系列图解_代码实现

代码实现

public ListNode ReverseList (ListNode head) {
        ListNode cur = head;
        ListNode pre = null;
        ListNode next = null;
        while(cur != null) {
            next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;

        }
        return pre;
    }




2.链表内指定区间反转

将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转

输入:

{1,2,3,4,5},2,4

返回值:

{1,4,3,2,5}

输入:

{5},1,1

返回值:

{5}

图解

反转链表系列图解_链表_02

要翻转m 到 n 的节点 先将当前cur的下标转到m;

反转链表系列图解_链表_03

反转链表系列图解_代码实现_04

反转链表系列图解_链表_05

反转链表系列图解_代码实现_06

代码实现

public ListNode reverseBetween (ListNode head, int m, int n) {
        ListNode res = new ListNode(-1);
        res.next = head;
        ListNode pre = res;
        ListNode cur = pre.next;
        for(int i = 0; i < m-1; i++) {
            pre = cur;
            cur = cur.next;
        }
        for(int i = m; i < n; i++) {
            ListNode next = cur.next;
            cur.next = next.next;
            next.next = pre.next;
            pre.next = next;
        }
        return res.next;
    }


3.链表中的节点每k个一组翻转

将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表

如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样

你不能更改节点中的值,只能更改节点本身。

图解

反转链表系列图解_链表_07

反转链表系列图解_链表反转_08


反转链表系列图解_代码实现_09

反转链表系列图解_链表_10

代码实现


public ListNode reverseKGroup (ListNode head, int k) {
        ListNode tail = head;
        for(int i = 0; i < k; i++) {
            if(tail == null) {
                return head;
            } else {
                tail = tail.next;
            }
        }
        ListNode pre = null;
        ListNode cur = head;
        while(cur != tail) {
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        head.next = reverseKGroup(tail,k);
        return pre;
    }





标签:pre,head,ListNode,cur,反转,next,链表,图解
From: https://blog.51cto.com/u_16166203/6963606

相关文章

  • 【数据结构 | 入门】线性表与链表 (问题引入&实现&算法优化)
    ......
  • 管道液位传感器怎么接线图解法
    管道光电液位传感器是利用红外光学组件,通过设计形成感应线路,判断光线在水与空气中的折光率不同,从而做出对液体状态的判断。光电管道传感器有效的解决了传统浮子传感器卡死失效的问题,同时也解决了电容式的感度衰减导致的失效问题,广泛应用于管道清水的检测,例如扫地机器人、洗碗机、饮......
  • 【剑指Offer】16、合并两个排序的链表
    【剑指Offer】16、合并两个排序的链表题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路:首先需要判断几个特殊情况,即判断输入的两个指针是否为空。如果第一个链表为空,则直接返回第二个链表;如果第二个链表为空,则直接......
  • C习题-链表02
    1、设数据结构 B=(D, R) ,其中D={ a, b, c, d, e, f }、 R={ (a,b ) , (b, c ) , (c, d ) , (d, e), (e, f), (f,a) },该数据结构为( )。A、非线性结构B、循环队列C、循环链表D、线性结构答案:A;图是非线性结构;线性结构:一对一,除第一个与最后一......
  • c语言链表demo
    #include<stdio.h>#include<stdlib.h>//定义节点结构体structnode{intdata;structnode*next;/*注意:这行使用了node,node必须在这行之前定义*/};intmain(intargc,constchar*argv[]){//1.定义链表的头节点,并初始化structno......
  • C习题-链表01
    1、用邻接表表示图进行深度优先遍历时,通常是采用()来实现算法的。A.栈B.队列C.树D.图答案:A;深度优先遍历(DFS):从某个顶点出发,一直往下一个顶点遍历,直到没有下一个顶点为止,再返回上一个顶点的其他路径继续进行深度优先,直到该出发顶点的所有深度优先遍历结......
  • 什么时候该用数组型容器、什么时候该用链表型容器?
    选择数组型容器还是链表型容器取决于特定的使用场景和需求。以下是一些指导原则:使用数组型容器的情况:快速随机访问:数组在具有固定大小的情况下,可以通过索引进行快速随机访问,时间复杂度为O(1)。这是因为数组的元素在内存中是连续存储的。内存连续性:数组在内存中是连续存储......
  • 依赖注入(DI)、控制反转(IOC)、反射的区别和联系?
    实现IOC控制反转的技术叫做反射。而反射通俗的说,反射就是根据给出的类名(字符串)来生成对象。这种编程方式可以让应用在运行时才动态决定生成哪一种对象。反射的应用是很广泛的,像Hibernate、Spring中都是用“反射”做为最基本的技术手段。其实可以把IoC模式看作工厂模式的升华,把IoC......
  • 链表双指针技巧汇总 [labuladong-刷题打卡 day1]
    双指针合并21.合并两个有序链表比较简单的双指针比较算法,两个指针分别指向待合并链表/序列,比较后选择符合条件的指针移动Trick:链表在实现时,带头节点的链表在操作中更方便题解/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNo......
  • 数据结构与算法(三):单向链表
    链表定义链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑是通过链表种的指针链接次序实现的。链表由一系列节点组成,每个节点包括两部分:一个是存储数据元素的数据域,一个是存储下一个节点地址的指针域。单向链表从头节点(也可以没有头节点)开始,指针指向下一个节点的......