ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于链表的一些题目

2022-03-30 12:31:31  阅读:138  来源: 互联网

标签:head slow ListNode fast next 链表 关于 题目 null


关于链表的一些题目

1、双链表的交点

  • 使用双指针,假设 A 链表的长度是 lenA ,B的长度是 lenB,根据lenA+lenB = lenB+lenA,让A指针遍历完A之后去便利B,B指针同理。即可在相遇时获得交点。即使没有交点,两指针在遍历完两个链表之后会同时指向 null
  • 如果其中一个链表为空,则没有焦点。
  • 注意三元运算符的写法,之前先判空,再赋值的写法错了。
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headB==null || headA==null) return null;
        ListNode ptr1 = headA;
        ListNode ptr2 = headB;
        while(ptr2 != ptr1){
            ptr1 = ptr1==null ? headB : ptr1.next;
            ptr2 = ptr2==null ? headA : ptr2.next;
        }
        return ptr1;
    }

2、链表是否有环

  • 使用快慢指针,快指针一次两个,慢指针一次一个。入果快慢指针能相遇的话,就说明链表存在环。

  • 这个相遇点在哪里呢?假设起点到环入口的距离是 a ,入口到相遇点的距离是 b ,相遇点顺时针再到入口的距离是c

    则有:2(a+b)= a + nc + (n+1)b -> a = c + (n-1)(b+c) 意思是:起点到入口点的距离是 (n-1 ) 倍的环长加上 c,c 就是相遇点顺时针到入口的举例。于是继续让slow从相遇点走,另一个ptr 从起点走,最终必定在入口相遇。

 public ListNode detectCycle(ListNode head) {
        if(head==null ||head.next==null ||head.next.next==null) return null;
        ListNode slow = head;
        ListNode fast = head;
        while(fast != null){
            slow = slow.next;
            if(fast.next != null) fast = fast.next.next;
            else return null;
            if(slow == fast){
                ListNode ptr = head;
                while(ptr != slow){
                    ptr = ptr.next;
                    slow = slow.next;
                }
                return ptr;
            }
        }
        return null;
    }

3、删去倒数第 n 个节点

  • 使用双指针,先让快指针走 n 步,再让两者一起走,那么当快指针走到 null 的时候,慢指针刚好走了 len - n 步,倒数第 n 个节点刚好是慢指针所在的节点。但是要删除的是这个节点,所以在慢指针开始的时候,让慢指针指向一个新建的temp节点,这个节点的next指向head,有可能刚好就头节点一个节点,要删除这个节点,那么返回的是 temp.next 而不是 head

     public ListNode removeNthFromEnd(ListNode head, int n) {
            if(head == null) return null;
            ListNode temp = new ListNode(0,head);
            ListNode slow = temp;
            ListNode fast = head;
            while(n>0){
                fast = fast.next;
                n--;
            }
            while(fast != null){
                fast = fast.next;
                slow = slow.next;
            }
            slow.next = slow.next.next;  
            return temp.next;      
        }
    

标签:head,slow,ListNode,fast,next,链表,关于,题目,null
来源: https://www.cnblogs.com/AN-KATG/p/16076431.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有