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

本文提供了三段关于链表操作的代码实现,包括两两交换链表中的节点,删除链表的倒数第N个节点,以及找出两个链表的交点。交换节点的代码使用了预存节点值的方法,删除节点通过双指针实现,找到链表交点则通过计算长度差进行同步遍历。
摘要由CSDN通过智能技术生成

24. 两两交换链表中的节点 (有点难度的)

我的代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode temp01 = null;
        ListNode temp02 = null;
        ListNode dummy = new ListNode(-1, head);
        ListNode cur = head;
        ListNode pre = dummy;
        // 注意 while内条件
        while (cur != null && cur.next != null) {
            temp01 = pre.next;
            pre.next = cur.next; 
            temp02 = cur.next.next;
            cur.next.next = cur;
            cur.next = temp02;
			// 指针后移准备下一轮循环  只需要对pre和cur移动就可以了
            pre = pre.next.next;
            cur = pre.next;

        }
        return dummy.next;
    }
}
  1. 题目最好画图理清楚结点之间的关系
    左边是结点之间前后关系,右边是对应操作的代码。在这里插入图片描述
    ① 其中,pre.next 和 cur.next.next 的值会被覆盖,要提前存储到临时变量 temp01和temp02里。
    ② 指针后移准备下一轮循环 只需要对pre和cur移动就可以了

  2. while循环:cur != null && cur.next != null
    这个容易出错,这段代码意思:A结点和B结点都存在时

19.删除链表的倒数第N个节点 (很简单)

我的代码: (双指针,first = low + n)

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(-1, head);
        ListNode low = dummy, first = dummy;
        // 让 first 后移 n 次
        while (n != 0) {
            first = first.next;
            n--;
        }
        // 当fisrt指向最后一个结点的时候
        while (first.next != null) {
            first = first.next;
            low = low.next;
        }
        // 删除操作
        low.next = low.next.next;
        return dummy.next;
    }
}
  1. 流程如图所示:
    删除的目标节点是 C
    在这里插入图片描述
    让 first = low + n ,即 first = low + 4
    当 first 最后一个结点的时候,low是目标节点的前一个

面试题 02.07. 链表相交 ⭐(不会做)

答案代码:

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode curA = headA;
        ListNode curB = headB;
        int lenA = 0, lenB = 0;
        while (curA != null) { // 求链表A的长度
            lenA++;
            curA = curA.next;
        }
        while (curB != null) { // 求链表B的长度
            lenB++;
            curB = curB.next;
        }
        curA = headA;
        curB = headB;
        // 让curA为最长链表的头,lenA为其长度
        if (lenB > lenA) {
            //1. swap (lenA, lenB);
            int tmpLen = lenA;
            lenA = lenB;
            lenB = tmpLen;
            //2. swap (curA, curB);
            ListNode tmpNode = curA;
            curA = curB;
            curB = tmpNode;
        }
        // 求长度差
        int gap = lenA - lenB;
        // 让curA和curB在同一起点上(末尾位置对齐)
        while (gap-- > 0) {
            curA = curA.next;
        }
        // 遍历curA 和 curB,遇到相同则直接返回
        while (curA != null) {
            if (curA == curB) {
                return curA;
            }
            curA = curA.next;
            curB = curB.next;
        }
        return null;
    }

}

142.环形链表II ⭐(不会做)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值