代码随想录算法训练营第四天|链表2

19. 删除链表的倒数第 N 个结点

  • 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

  • 示例 1:

     
  • 输入:head = [1,2,3,4,5], n = 2  
    输出:[1,2,3,5]
    
    
     ListNode* removeNthFromEnd(ListNode* head, int n) {
                ListNode*vhead = new ListNode(-1,head);
         
                ListNode* pre = vhead;   
                ListNode* cur = vhead;
         
                while(n--)    //&& cur->next != nullptr   这里的n一定要小于 size
                {
                    cur = cur->next;
                }
            
                //cur = cur->next;
                while(cur->next != nullptr)  //cur 最后指向是最后一个节点
                {
                    cur = cur->next;
                    pre = pre->next;
                }
        
                ListNode * temp = pre->next;
                pre->next= pre->next->next;
                delete temp;
                return vhead->next;      // 有可能把原来的head删了所以要返回vhead->next;     
         }
     

160. 相交链表

  • 给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null

    图示两个链表在节点 c1 开始相交

  •   
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
                if(headA == nullptr || headB == nullptr) return nullptr;
        
                ListNode *PA = headA,*PB = headB;
        
                while(PA != PB)
                {
                    if(PA == nullptr)
                    {
                        PA = headB;
                    }else{
                        PA = PA->next;
                    }
                    
                    if(PB == nullptr)
                    {
                        PB = headA;
                    }else{
                        PB = PB->next;
                    }
                }
                return PA;
        
            }

  • pA走过的路径为A链+B链

    pB走过的路径为B链+A链

    pA和pB走过的长度都相同,都是A链和B链的长度之和,相当于将两条链从尾端对齐,如果相交,则会提前在相交点相遇,如果没有相交点,则会在最后相遇。

  •  pA:1->2->3->4->5->6->null->9->5->6->null
     pB:9->5->6->null->1->2->3->4->5->6->null

142. 环形链表 II

  • 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

    如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

  • ListNode *detectCycle(ListNode *head) {
             if(head == nullptr)
                 return nullptr;
             ListNode* vhead = new ListNode(-1,head);
     ​
             ListNode * pre = vhead;  //保证出发点一致即可 //这里和16行都换成head 也可
             ListNode * cur = vhead;
     ​
             while( cur->next != nullptr&& cur->next->next != nullptr  )
             {
                 cur = cur->next->next;
                 pre = pre->next;
                 if(cur == pre )
                 {
                     ListNode*index1 = cur ;
                     ListNode*index2 = vhead;
     ​
                     while(index1 != index2)
                     {
                         index1 = index1 -> next;
                         index2 = index2 -> next;
                     }
                     return index2 ;
                 }
             }
             return nullptr;
         }

  • 一定保证出发点是一致的

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录八股文第四版pdf》是一本关于编程的指南,旨在帮助读者提高编程技能和优化代码。本书内容丰富全面,适合广大程序员和编程爱好者阅读。 首先,本书分为多个章节,每个章节涵盖了不同的编程主题。比如,第一章讲解了基础的编程概念和语法,包括变量、循环和函数等。第二章介绍了面向对象编程(OOP)的概念和原则,如封装、继承和多态等。接下来的章节逐步介绍了数据结构算法,如数组、链表、栈和队列,以及排序和搜索算法等。此外,本书还对常见的编程问题进行了详细分析和解答,帮助读者培养解决问题的思维方式。 其次,本书的特色之一是通过八股文的形式呈现编程知识。作者以简练明了的语言,将复杂的编程概念和技巧概括成几句话,大大提高了读者的理解和记忆效果。例如,对于OOP的解释可以是:“封装数据和行为,继承通用特性,多态表现灵活性。”这种精炼的表述使得读者能够快速抓住核心要点,方便理解和运用。 此外,本书还提供了大量的实例代码和练习题,帮助读者巩固所学知识和提高编码能力。每个章节都附带了相关的代码示例,读者可以通过阅读代码和运行实验,加深对理论知识的理解。此外,练习题既可以作为学习过程中的自测工具,又可以作为深入学习和巩固知识的手段。 综上所述,《代码随想录八股文第四版pdf》是一本内容全面、形式独特的编程指南。通过阅读本书,读者可以系统学习编程知识和技巧,提高编码能力,为日后的编程工作打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值