剑指 Offer 18. 删除链表的节点【4】

难度等级:简单

上一篇算法:

剑指 Offer 22. 链表中倒数第k个节点【链表】

力扣此题地址:

剑指 Offer 18. 删除链表的节点 - 力扣(LeetCode)

1.题目:删除链表的节点

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。

返回删除后的链表的头节点。

2.解题思路:

删除链表分三种情况:

1.删除第一个位置的结点

2.删除中间以及最后位置的结点

3.链表中没有要删除的结点

思路:

1.删除第一个结点,直接返回链表下一个结点即可

2.删除中间或最后位置的结点,首先设置两个指针,pre和cur指针,pre指向前一个结点,cur指向当前结点,用while循环遍历链表,判断是否是要删除的结点,找到了就跳出循环,然后将当前结点的前一个结点pre指向下一个结点cur.next;

3.跳出循环后,判断一下cur是否为null,为null则表示链表中没有要删除的结点,则返回head

3.代码实现: 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteNode(ListNode head, int val) {
        //特殊情况处理,删除的节点是头结点时,比较特别
        if(head.val == val) return head.next;

        //设置两个指针,一个指针指向当前的节点
        ListNode pre = head;

        // 一个指针指向当前节点的下一节点
        ListNode cur = head.next;

        //当 cur 为空 或 cur 节点值等于 val 时跳出跳出循环
        while( cur != null && cur.val != val){

            // 两个指针不断的向前移动
            // pre 来到 cur 的位置
            pre = cur;

            // cur 来到下一个节点位置
            cur = cur.next;
        }

        //如果链表中没有要删除的结点,则返回头结点
        if(cur == null){
            return head;
        }

        // 相当于覆盖掉了 cur 的节点值
        pre.next = cur.next;

        // 最后返回链表头结点就行
        return head;

    }
}

4.单链表知识点参考:

单链表的基本操作_Java运动猿的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值