【链表】链表禁止直接操作头节点

例如LeetCode83删除链表中的重复元素

错误解法

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
       
        if(head==null ||head.next==null) return head;
        while(head.next!=null){
            if(head.val!=head.next.val){
               
           
                head=head.next;
            }
        else{
        head.next=head.next.next;
        
        }
        

    }
    return  head;
}
}

头节点一直在动,无法取到头节点的值

 比如我们有一个链表如下:

在这里插入图片描述

此时 head 就是 1 这个位置,但是链表是连着的,输出 head 你会得到一整串以 1 为起点的链子,也就是[1, 2, 3],head.next 会输出 [2, 3]

 

因此,我们正确做法可以找一个跑腿指针去操作链表,这样head头节点就不会移动了

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        //理解值传递和引用传递
        if (head == null) {
            return head;
        }

        ListNode cur = head;
        while (cur.next != null) {
            if (cur.val == cur.next.val) {
                cur.next = cur.next.next;
            } else {
                cur = cur.next;
            }
        }

        return head;
    }
}

【编程】为什么不能直接对链表头head进行操作?_YaoYee_7的博客-CSDN博客_链表中head

对于网上对于为什么不能直接操作头节点的最佳回答:

首先,由于单链表只能从前往后遍历,不能回头,所以一定需要保存第一个节点才能访问完整的链表。也就是:必须在每个时刻都有一个指针是指向第一个节点的。既然目前head已经指向了它,那就不操作head,让head一直指向第一个节点好了。所以需要新建指针,来对链表进行操作。对链表的大部分操作都是这样处理的,不会动head指针。
其次,对于“删除链表”这个操作,假定删除的是current,那么需要把current的前一个节点的next指向current的后一个节点,然后释放current对应的内存。还是由于单链表不能回头,既然要访问current的前一个节点,就必须用一个指针指向current的前一个节点,在这里用previous表示这个指针了。再加上current本身也要保存(不然没办法释放current占用的内存),就至少需要两个指针了。
对链表的所有操作都画个图看比较明了~ 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JagTom

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

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

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

打赏作者

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

抵扣说明:

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

余额充值