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

这篇具有很好参考价值的文章主要介绍了代码随想录复习 29删除倒数第N个节点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码如下 

/**

 * 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


 

}文章来源地址https://www.toymoban.com/news/detail-438623.html

链表相交 

代码如下 

/**

 * 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 


 

}

到了这里,关于代码随想录复习 29删除倒数第N个节点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包