首页 > 其他分享 >链表

链表

时间:2024-03-05 14:44:05浏览次数:18  
标签:slow 指向 fast 链表 节点 指针

一、移除链表元素

构造虚拟链表,虚拟链表的头节点的指针指向链表头节点

 

二、设计链表

构造函数创建新的链表节点对象

 

三、反转链表

思想:改变指针指向,利用temp指针指向每次断开链表的head位置,和双指针更改指向

双指针or递归

 

四、两两交换相邻节点

不改变节点值的情况下考虑修改指针指向

添加虚拟头节点,使temp指向头节点,交换顺序依次为:temp.next=cur, pre.next=cur.next, cur.next=pre,最重要的是使temp=pre,这样才能保证后续交换pre和cur的指向正确

 

五、删除链表倒数第N个节点

思想:双指针,fast和slow初始指向虚拟头节点,,fast比slow多后移n步,之后fast和slow同步后移知道fast到达链表末尾,注意此时slow的下一个才是要删除的节点

 

六、链表相交

思想1:两个链表尾部对齐,长的链表后移(两链表长度之差)位,循环,两节点不相等就同时后移

思想2:双指针。A表循环完循环B,(重合部分为c),一定有a+c+b=b+c+a,A循环B时一定会和B循环A时的c部分相交。(c也可能是null)

 

七、环形链表

思想:双指针,fast走两步,slow走一步,有环肯定会相遇

 

1、是否有环

fast走两步,slow走一步,直到fast=slow(相遇点),(相当于slow走了x+y步,fast走了x+y+n(y+z)步,2(x+y)=x+y+n(y+z),想知道的值是x,那么x=(n-1)(y+z)+y )

2、入口节点

此时重新将slow返回head,fast走一步,slow走一步,直到fast=slow(入口点)(此时slow走了x步,fast走了(n-1)(y+z)+y步)

标签:slow,指向,fast,链表,节点,指针
From: https://www.cnblogs.com/LiChaoyue-11/p/18051568

相关文章

  • Leetcode刷题第十六天-链表
    24:两两交换链表中的节点链接:24.两两交换链表中的节点-力扣(LeetCode)虚拟头节点#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,val=0,next=None):#self.val=val#self.next=nextclassSolution:defswap......
  • 第二节:栈相关(二叉树展开为链表、逆波兰表达式、两栈实现队列结构)
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • 147. 对链表进行插入排序(中)
    目录题目题解优化题目给定单个链表的头head,使用插入排序对链表进行排序,并返回排序后链表的头。插入排序算法的步骤:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在......
  • leedcode 相交链表
    会超出时间限制:classSolution:defgetIntersectionNode(self,headA:ListNode,headB:ListNode)->Optional[ListNode]:cur_b=headBcur_a=headAwhilecur_b!=None:#两个相等ifcur_b==cur_a:r......
  • 【LeetCode】876_链表的中间结点_C
    题目描述给你单链表的头结点head,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。https://leetcode.cn/problems/middle-of-the-linked-list/description/示例提示:链表的结点数范围是[1,100]1<=Node.val<=100解题思路思路一遍历链......
  • Leetcode刷题第十五天-链表
    203:移除链表元素链接:203.移除链表元素-力扣(LeetCode)#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,val=0,next=None):#self.val=val#self.next=nextclassSolution:defremoveElements(self,head:Op......
  • 【C++】相对于数组,在链表中添加和删除元素更容易,但排序速度更慢。这就引出了一种可能
    相对于数组,在链表中添加和删除元素更容易,但排序速度更慢。这就引出了一种可能性:相对于使用链表算法进行排序,将链表复制到数组中,对数组进行排序,再将排序后的结果复制到链表中的速度可能更快;但这也可能占用更多的内存。请使用如下方法检验上述假设。a.创建大型vector<int>对象vi0,并......
  • 142. 环形链表 II C
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*detectCycle(structListNode*head){if(!head||!head->next)returnNULL;structListNode*slow=head;s......
  • 面试题 02.07. 链表相交C
    利用链表的特性,如果相交的话,后面就不可能岔开!你可以想象把他们有同一个尾巴,然后从尾巴往前看。所以只要知道两个链表的长度,就可以在同一起跑线上一起比较了。/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;......
  • 19. 删除链表的倒数第 N 个结点C
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*removeNthFromEnd(structListNode*head,intn){if(!head)returnNULL;inti=0;structListNode*tem=head;......