剑指offer——删除链表的节点

题目描述:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。

数据范围:

0 <=链表节点值 <= 10000

0 <=链表长度 <= 10000

示例1:

输入:{2,5,1,9},5

返回值:{2,1,9}

说明:

给定你链表中值为5的第二个节点,那么在调用了你的函数之后,该链表应变为2 -> 1 -> 9

示例2:

输入:{2,5,1,9},1

返回值:{2,5,9}

说明:

给定链表中值为1的第三个节点,那么在调用了你的函数之后,该链表应变为2 -> 5 -> 9 

思路及解答:

 如果我们要删除链表里面的一个节点,其实就是将前置节点的next直接指向当前节点的后置节点,这样在链表中再也找不到该节点了,也就是相当于删除了。

假设有一个链表,我们需要删除里面的5:

首先需要判断链表头结点是不是为空,如果为空,那么就直接返回null,如果等于我们要找的,那么直接返回下一个节点引用即可。如果不符合以上说的,我们则需要新建一个前置节点pre,与现在的链表连接在一起:

 

然后初始化一个cur节点表示当前节点,指向head节点:

 

cur不为空,cur和pre后移:

 

发现cur正是我们需要查找的5,那么记录下5的下一个节点1,也就是next:

 

 cur的next指向null,使用pre的next指向刚刚记录的next:

简化链表也就是:

 

取之前虚拟的头结点的后一个节点,就是删除掉之后的新链表:

 

Java实现代码如下所示:

class ListNode{
    int val;
    ListNode next = null;

    public ListNode(int val){
        this.val = val;
    }
}

public class Solution{
    public ListNode deleteNode(ListNode head,int val){
        if(head == null){
            return null;
        }
        if(head.val == val){
            return head.next;
        }
        //用一个节点将头节点链接起来
        ListNode pre = new ListNode(-1);
        pre.next = head;

        ListNode cur = head;
        ListNode next = null;
        while(cur != null){
            cur = cur.val;
            pre = pre.next;
            //如果相等,则指针指向下一个节点
            if(cur.val == val){
                next = cur.next;
                break;
            }
        }
        cur.next = null;
        //将前置节点直接连接后一个节点,相当于删除掉了该节点
        pre.next = next;
        return head;
    }    
}

 

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅亦予

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值