代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 02.07. 链表相交 142.环形链表II

 24. 两两交换链表中的节点 

用虚拟头结点,这样会方便很多。 

本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。

文章讲解/视频讲解: 代码随想录

题目链接:24. 两两交换链表中的节点

思想:一开始逻辑不对,没有设置好循环,根据文章的步骤一二三写的简洁版

代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 02.07. 链表相交 142.环形链表II_第1张图片24.两两交换链表中的节点1

public ListNode swapPairs(ListNode head) {
        if(head == null || head.next ==null)   
            return head;
        ListNode dummy = new ListNode(-1,head);//虚头节点
        ListNode pre = dummy;
        ListNode cur = dummy.next;
        ListNode temp = null; 
        while(cur != null  &&  cur.next!=null){//不断更新pre/cur,以两个节点为单位进行操作
            temp = cur.next.next;
            pre.next = cur.next;
            pre.next.next = cur;
            cur.next = temp;
            pre = cur;
            cur = temp;
        }
        return dummy.next;
    }

 19.删除链表的倒数第N个节点  (字节面试题)

双指针的操作,要注意,删除第N个节点,那么我们当前遍历的指针一定要指向 第N个节点的前一个节点,建议先看视频。

文章讲解/视频讲解:代码随想录

题目链接:19. 删除链表的倒数第 N 个结点

public ListNode removeNthFromEnd(ListNode head, int n) {
        if (head == null) {
            return null;
        }
        ListNode index1 = head;
        ListNode index2 = head;
        int i = 0;
        while(i++ < n){
            index2 = index2.next;
        }
        if (index2 == null) {
            return head.next;
        } // 删除头节点
        while(index2.next != null){
            index1 = index1.next;
            index2 = index2.next;
        }
        index1.next = index1.next.next;
         
        return  head;
    }

 02.07. 链表相交(面试题)  

can本题没有视频讲解,大家注意 数值相同,不代表指针相同。

文章讲解:代码随想录

题目链接:02.07. 链表相交

思路:没有思路,但是在leetcode上看到一个比较有意思的题解,参考代码随想录的思想再自己写一遍。

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode curA = headA;
        ListNode curB = headB;
// 要么相遇即节点相等,要么都为空即无缘无分,最终都能跳出感情的死循环。
        while(curA != curB){
// 两人以相同的速度(一次一步)沿着各自的路径走,当走完各自的路时,再“跳”至对方的路上。(起点平齐速度相同,终点即为相遇点)
            curA = (curA == null? headB:curA.next);
            curB = (curB == null? headA:curB.next);
        }
        return curA;
    }
ListNode curA = headA;
        ListNode curB = headB;
        int lena=0,lenb=0;
        while(curA != null){
            curA = curA.next;
            lena++;
        }
        while(curB!= null){
            curB = curB.next;
            lenb++;
        }
        if(lena

 142.环形链表II  

算是链表比较有难度的题目,需要多花点时间理解 确定环和找环入口,建议先看视频。

文章讲解/视频讲解:代码随想录

题目链接:142. 环形链表 II

思路:太牛了,记住结论

ListNode slow = head;
        ListNode fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {// 有环
                ListNode index1 = fast;
                ListNode index2 = head;
                // 两个指针,从头结点和相遇结点,各走一步,直到相遇,相遇点即为环入口
                while (index1 != index2) {
                    index1 = index1.next;
                    index2 = index2.next;
                }
                return index1;
            }
        }
        return null;

你可能感兴趣的:(算法刷题,算法)