刷题打卡——删除中间节点、分割链表

395 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

第一题:删除中间节点

一、题目描述:

若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。

假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。

例如,传入节点 c(位于单向链表 a->b->c->d->e->f 中),将其删除后,剩余链表为 a->b->d->e->f

示例:

输入:节点5(位于单向链表4->5->1->9中)
输出:不返回任何数据,从链表中删除传入的节点 5,使链表变为4->1->9

二、思路分析:

这题我一看很简单,然后当我准备写代码的时候我发现方法参数只有一个当前节点,我没法拿到前一个节点,这我可怎么办,一般我们删除链表节点就是把指向当前节点的前一个节点指向该节点的下一个节点,但是我现在不知道前一个节点。

所以只能通过把自己伪装成下一个节点,然后指向下一个节点的下一个节点。 比如a->b->c->d,要删除b,我就把b变成c即可。

三、AC 代码:

class Solution {
    public void deleteNode(ListNode node) {
        node.val = node.next.val;
        node.next = node.next.next;
    }
}

第二题:分割链表

一、题目描述:

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你不需要 保留 每个分区中各节点的初始相对位置。

示例1:

f0563336a7a8e52b45b11cf4225faee4.png

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

示例 2:

输入:head = [2,1], x = 2
输出:[1,2]

提示:

链表中节点的数目在范围 [0, 200] 内
-100 <= Node.val <= 100
-200 <= x <= 200

二、思路分析:

本题题目一开始有点难读懂,结合示例就能看明白,需要把小于当前数的数放在大于当前数的前面。我们可以使用两个链表,一个用来存小于当前数的节点,一个用来存大于当前节点的节点,然后把后面节点和前面节点连起来即可。

三、AC 代码:

class Solution {
    public ListNode partition(ListNode head, int x) {
        ListNode lower = new ListNode(0);
        ListNode higher = new ListNode(0);
        ListNode l = lower;
        ListNode h = higher;
        while(head!=null){
            if(head.val < x){
                l.next=head;
                l = l.next;
            }else{
                h.next=head;
                h = h.next;
            }
            head = head.next;
        }
        l.next = higher.next;
        h.next = null;
        return lower.next;
    }
}

总结

今天第一题让我学到了链表的“自杀”操作,把自己变成别人,对于链表的操作主要是指针一定要分清楚。欢迎大家一起学习打卡。