训练营练习-Day4&链表2

文章介绍了LeetCode中涉及链表操作的四道题目,包括24题的节点对交换、19题的删除倒数第N个节点、02.07题的链表交点和142题的环形链表检测。解题策略包括使用虚拟头节点简化操作、快慢指针寻找特定位置和判断环以及利用哈希表找出链表交点。
摘要由CSDN通过智能技术生成

Leetcode 24 力扣

解法:虚拟头节点,然后按照交换步骤执行

public ListNode swapPairs(ListNode head) { // 1 -> 2 ->3->4  虚拟头节点后 0 -> 2->1-> 4->3
    ListNode pre = new ListNode(-1); // 设置一个虚拟头结点
    pre.next = head;
    ListNode cur = pre;
    ListNode temp = null; // 临时节点,保存两个节点后面的节点
    ListNode firstNode = null; // 两个节点中第一个节点
    ListNode secondNode = null; // 两个节点中第二个节点
    while (cur.next != null && cur.next.next != null){
        temp = cur.next.next.next;
        firstNode = cur.next;
        secondNode = cur.next.next;
        cur.next = secondNode; // 步骤一
        secondNode.next = firstNode; // 步骤二
        firstNode.next = temp; // 步骤三
        cur = firstNode;
    }
    return pre.next;
}

Leetcode 19 力扣

解法:虚拟头节点+快慢指针确定倒数N的位置

// 倒数节点如何找?区别于第N个下标直接遍历即可;倒数位置需要使用快慢指针,让快指针先走N步,然后快慢指针同时移动
public ListNode removeNthFromEnd(ListNode head, int n) {
    ListNode pre = new ListNode(-1);
    pre.next = head;
    ListNode slow = pre;
    ListNode fast = pre;
    for (int i = 0; i < n; i++) { //快指针先走N步,然后同时移动快慢指针,实际走了n-1步,当快指针指向null时,慢指针指向倒数n的前一个位置
        fast = fast.next;
    }
    while (fast.next != null){
        slow = slow.next; // 顺序不能乱,快指针先走,快慢指针同时移动时候
        fast = fast.next; // 顺序不能乱,慢指针后走,快慢指针同时移动时候
    }
    slow.next = slow.next.next;
    return pre.next;
}

Leetcode  02.07. 链表相交 力扣

解法:使用哈希先将链表1加入,遍历链表2时候判断哈希存在与否,存在即返回交点,不存在交点返回null

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    Set<ListNode> nodes = new HashSet<>();
    ListNode temp = headA;
    while (temp != null){
        nodes.add(temp);
        temp = temp.next;
    }
    temp = headB;
    while (temp != null){
        if (nodes.contains(temp)){
            return temp;
        }
        temp = temp.next;
    }
    return null;
}

Leetcode 142 力扣

解法:1.判断环如何判断?(快慢从head出发指针相遇,快指针走两段,慢指针走一段)

    2.如何判断环入口?X=Z时候满足,定义index1为fast,index2从head出发,index1=index2满足

 

public ListNode detectCycle(ListNode head) {
    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; // 慢指针从head走
            while (index1 != index2){ // 不相遇一直往前走
                index1 = index1.next;
                index2 = index2.next;
            }
            return index1;

        }
    }
    return null;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值