第四天 | 两两交换链表中的节点 | 删除链表中倒数第N个节点 | 链表相交 | 环形链表2

2,326 阅读1分钟

两两交换链表中的节点

随想录的文章链接

programmercarl.com/0024.%E4%B8…

看完代码随想录之后的想法

递归的思路更简单一些。

自己实现过程中遇到哪些困难

没碰到困难。

今日收获,记录一下自己的学习时长

文章5分钟,写代码15分钟。

public static ListNode swapPairs(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }

    ListNode cur = head;
    ListNode next = cur.next;
    cur.next = swapPairs(next.next);
    next.next = cur;
    head = next;
    return head;
}

删除链表中倒数第N个节点

随想录的文章链接

programmercarl.com/0019.%E5%88…

看完代码随想录之后的想法

没啥想法,之前被面试过,一样的思路。

自己实现过程中遇到哪些困难

没碰到困难。

今日收获,记录一下自己的学习时长

文章5分钟,写代码10分钟。

public static ListNode removeNthFromEnd(ListNode head, int n) {
    ListNode dummyHead = new ListNode(0, head);
    ListNode first = dummyHead;
    for (int i = 0; i < n + 1; i++) { // 先走n+1步
        first = first.next;
    }

    ListNode second = dummyHead;
    while (first != null) {
        second = second.next;
        first = first.next;
    }
    second.next = second.next.next;
    return dummyHead.next;
}

链表相交

随想录的文章链接

programmercarl.com/%E9%9D%A2%E…

看完代码随想录之后的想法

没想出来判断相交的方法,惭愧!!!

自己实现过程中遇到哪些困难

不知道如何判断相交。

今日收获,记录一下自己的学习时长

文章5分钟,写代码15分钟。

public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    int lengthA = 0;
    ListNode tempA = headA;
    while (tempA != null) {
        tempA = tempA.next;
        lengthA++;
    }

    int lengthB = 0;
    ListNode tempB = headB;
    while (tempB != null) {
        tempB = tempB.next;
        lengthB++;
    }

    if (lengthA == 0 || lengthB == 0) {
        return null;
    }

    int diff = lengthA > lengthB ? lengthA - lengthB : lengthB - lengthA;
    tempA = lengthA > lengthB ? headA : headB;
    tempB = lengthA > lengthB ? headB : headA;
    for (int i = 0; i < diff; i++) {
        tempA = tempA.next;
    }

    while (tempA != null && tempA != tempB) {
        tempA = tempA.next;
        tempB = tempB.next;
    }

    return tempA;
}

链表相交

随想录的文章链接

programmercarl.com/0142.%E7%8E…

看完代码随想录之后的想法

不看文章,打死也做不出来,推理的过程还是要仔细琢磨。

自己实现过程中遇到哪些困难

知道如何判断是否有环,不知道怎么判断入口。

今日收获,记录一下自己的学习时长

文章15分钟,写代码8分钟。

public static ListNode detectCycle(ListNode head) {
    ListNode fast = head;
    ListNode slow = head;
    ListNode result = null;
    while (fast != null && fast.next != null) {
        fast = fast.next.next;
        slow = slow.next;
        if (fast == slow) { // 相遇,有环
            result = head;
            while (result != slow) {
                result = result.next;
                slow = slow.next;
            }
            break;
        }
    }
    return result;
}