代码随想录复习 29删除倒数第N个节点

news/2025/2/22 22:36:35

代码如下 

/**

 * Definition for singly-linked list.

 * type ListNode struct {

 *     Val int

 *     Next *ListNode

 * }

 */

func removeNthFromEnd(head *ListNode, n int) *ListNode {

                  dummyhead := &ListNode {   // 设置一个虚拟头结点

                      Next : head,

                  }

                   

                  fast := dummyhead //并设置快慢指针 

                  slow := fast 

                  for i := 0 ; i <= n ; i++ {  //要让慢指针走到倒数第n+1个节点,所以快指针需要先走n+1个节点。原因如下: 假设整个链表长度为size,那么快指针从虚拟头结点的位置走到nil需要size+1步,如果已经走了n+1步,则剩余的步数为size-n步。此时快慢指针同时走size-n步。此时快指针到达nil,慢指针还剩n+1步。而倒数第n个节点走到nil需要n步,那么慢指针还需要n+1步,说明慢指针此时在倒数第n+1个节点上,然后可以进行删除操作

                      fast = fast.Next 

                  }

                  for fast != nil {

                      fast = fast.Next

                      slow = slow.Next

                  }

                  slow.Next = slow.Next.Next

                  return dummyhead.Next


 

}

链表相交 

代码如下 

/**

 * Definition for singly-linked list.

 * type ListNode struct {

 *     Val int

 *     Next *ListNode

 * }

 */

func getIntersectionNode(headA, headB *ListNode) *ListNode {

          if headA == nil || headB == nil {  //链表相交的思路如下 ,先计算两个链表的长度,并计算长                                                               //度差,让长的链表先走长度差个位置。这是两个遍历指针                                                               //处于统一长度的位置,这样同步向下遍历,如果相遇返回                                                               //相遇节点,如果没相遇返回nil

                   return nil 

          }

          lena := 0 

          lenb := 0 

          cura := headA 

          curb := headB 

          for cura != nil {

              cura = cura.Next

              lena++ 

          }

          for curb != nil {

              curb = curb.Next 

              lenb++ 

          }

           cura = headA    //遍历前需要将两个指针回到头结点再开始遍历

          curb = headB 

          if  lenb > lena {

              lenc := lenb - lena 

              for i := 0 ; i < lenc ; i++ {

                  curb = curb.Next 

              }

          }else {

              lenc := lena - lenb 

              for i := 0 ; i < lenc ; i++ {

                  cura = cura.Next

              }

          }

          for cura != nil {

              if cura == curb {

                  return cura 

              }else {

                  cura = cura.Next 

                  curb = curb.Next

              }

          }

          return nil 

}

142 环形链表 

代码如下

思路如下 :设置两个指针,快指针每次走两步,慢指针每次走一步。如果快慢指针相遇,说明有环。相遇的时候,在将一个头节点指针,与慢指针同步移动,如果相遇则说明该节点是环开始的节点 

/**

 * Definition for singly-linked list.

 * type ListNode struct {

 *     Val int

 *     Next *ListNode

 * }

 */

func detectCycle(head *ListNode) *ListNode {

         if head == nil {

             return nil 

         }

         slow := head 

         fast := head 

         for fast != nil && fast.Next != nil {

             slow = slow.Next

             fast = fast.Next.Next

             if slow == fast {

                 for slow != head {

                     slow = slow.Next

                     head = head.Next

                 }

                 return slow 

             }

         }

         return nil 


 

}


http://www.niftyadmin.cn/n/307443.html

相关文章

如何实现一个完整的日期类?

文章目录 &#x1f356;前言Tip日期类的六大默认成员函数&#xff1a;一、&#x1f356;构造函数二、&#x1f356;拷贝构造函数三、&#x1f356;析构函数四、&#x1f356;日期类的赋值运算符重载五、&#x1f356;取地址运算符重载六、&#x1f356;const取地址运算符重载 日…

改进YOLOv5 | C3模块改动篇 | 轻量化设计 |骨干引入高效卷积运算 DSConv: Efficient Convolution Operator

论文地址:https://arxiv.org/pdf/1901.01928v1.pdf 引入了一种卷积层的变体,称为DSConv(分布偏移卷积),其可以容易地替换进标准神经网络体系结构并且实现较低的存储器使用和较高的计算速度。 DSConv将传统的卷积内核分解为两个组件:可变量化内核(VQK)和分布偏移。 通过…

QT界面开发杂记(五)

QString转char* QString("name").toStdString().c_str() c_str()没有‘\0’结尾可能导致一些错误可以使用以下方法解决&#xff1a; QString xmlPath "path"; const char cXmlName[1024] {0}&#xff1b; memcpy((void*)cXmlName,xmlPath.toStdStri…

C++ 智能指针和使用陷阱

引用&#xff1a;windows程序员面试指南 背景 人为的new和delete操作动态内存&#xff0c;容易出现两种问题&#xff1a; 1.忘记释放内存&#xff0c;会造成内存泄漏&#xff1b; 2.尚有指针引用内存的情况下就释放了它&#xff0c;就会产生引用非法内存的指针。 一.auto_pt…

网安笔记04 公钥密码体制

公钥密码体制 公钥密码体制的基本概念 保密性&#xff1a;确保信息只被授权的人访问 认证&#xff1a;确认某实体/数据源的真实性 保密性需要考虑到 不可否认性数据完整性 保密系统要考虑 达到实际上不可破 接获密文、某些明文密文对&#xff0c;决定密钥或者明文是不可…

OJ练习第102题——可被 K 整除的最小整数

可被 K 整除的最小整数 力扣链接&#xff1a;1015. 可被 K 整除的最小整数 题目描述 给定正整数 k &#xff0c;你需要找出可以被 k 整除的、仅包含数字 1 的最 小 正整数 n 的长度。 返回 n 的长度。如果不存在这样的 n &#xff0c;就返回-1。 注意&#xff1a; n 不符合…

C++14:AVL树

由于二叉搜索树在某些特定的情况下会退化成单叉树,为了解决这个问题&#xff0c;保证二叉搜索树能在绝大多数情况下保持高速搜索&#xff0c;G.M. Adelson-Velsky和E.M. Landis这两位俄国数学家提出了AVL树的概念&#xff0c;也就是高度平衡的搜索二叉树。 AVL树平衡大体逻辑&…

Java框架学习02(SpringSpringBoot常用注解总结)

1. SpringBootApplication 这里先单独拎出SpringBootApplication 注解说一下&#xff0c;虽然我们一般不会主动去使用它。 Guide&#xff1a;这个注解是 Spring Boot 项目的基石&#xff0c;创建 SpringBoot 项目之后会默认在主类加上。 SpringBootApplication public class…