删除链表中的元素,代码这句话是什么意思?

柯莹 2016-05-15 10:07:32
删除链表中等于给定值val的所有节点。
下面代码是正确答案。

public ListNode removeElements(ListNode head, int val) {
ListNode listnode = new ListNode(0);
listnode.next = head;
head = listnode; //这句话是什么意思?
while(head.next != null) {
if(head.next.val == val) {
head.next = head.next.next;
} else {
head = head.next;
}
}
return listnode.next;
}



我的代码是这样的(运行错误):

public ListNode removeElements(ListNode head, int val) {
ListNode listnode = new ListNode(0);
listnode.next = head;
while(head != null) {
if(head.val == val) {
head = head.next;
} else {
head = head.next;
}
}
return listnode.next;
}

为什么是错误的?
...全文
212 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
柯莹 2016-05-17
  • 打赏
  • 举报
回复
好吧,我觉得自己有些无聊,这个问题有些多余。 list这种数据结构中等号的意思就是“赋予”的意思。 head = listnode这句话是不是该这样理解:就是现在head的指针不要动,将listnode的节点以及它后面所有的节点移到head的指针下面。 谢谢大家帮我解答~
柯莹 2016-05-17
  • 打赏
  • 举报
回复
我明白了,谢谢。
我还想问的是就像head = listnode这句话,对于List这种数据结构,这个里面的等于号“=”还是普通数据结构里面“赋予”的意思吗?就是说我这里是将listnode节点赋予head节点的意思吗?
我这里将head = listnode改为
listnode =  head;

这里发生了错误。
错误原因如下:

renwotao2009 2016-05-15
  • 打赏
  • 举报
回复
引用 3 楼 u011974997 的回复:
[quote=引用 2 楼 renwotao2009 的回复:] 1 头结点head的赋值;传进来head其实是没有带头结点的链表,
ListNode listnode = new ListNode(0);
        listnode.next = head;        
这里等于创建一个头结点listnode,然后listnode->next=head赋值把传进来的链表链接到头结点listnode上
那么为什么还有下一句呢? 第四行
head = listnode; 
这句是什么意思?[/quote]其实给链表增加了头结点,这就是所谓的带头节点的链表,所以这里给head=listnode
renwotao2009 2016-05-15
  • 打赏
  • 举报
回复
public ListNode removeElements(ListNode head, int val) {
        ListNode listnode = new ListNode(0);
        listnode.next = head;        
        while(head != null) {
            if(head.val == val) {
                head = head.next; // 你的代码在这里有错误,应该head节点的父节点的next节点保存head的next节点,否则你这里没有删除head.val==val的节点
            } else {
                head = head.next;
            }
        }
        return listnode.next;
    }
shuaishuai3409 2016-05-15
  • 打赏
  • 举报
回复
首先你应该明白代码在链表前加了一个头结点(无任何元素) 而第一个代码中head = listnode是让head变为头结点。我们都知道不带头结点的删除操作,要把第一个节点和其他节点分开考虑,而加上头结点后,所有节点的删除操作都一样了。 你的代码从第一个节点开始遍历,如果恰好第一个节点是要删除的,你的会把链表给断开。
柯莹 2016-05-15
  • 打赏
  • 举报
回复
引用 2 楼 renwotao2009 的回复:
1 头结点head的赋值;传进来head其实是没有带头结点的链表,
ListNode listnode = new ListNode(0);
        listnode.next = head;        
这里等于创建一个头结点listnode,然后listnode->next=head赋值把传进来的链表链接到头结点listnode上
那么为什么还有下一句呢? 第四行
head = listnode; 
这句是什么意思?
柯莹 2016-05-15
  • 打赏
  • 举报
回复
我已经修改了第二个代码。第二个问题忽略。
renwotao2009 2016-05-15
  • 打赏
  • 举报
回复
1 头结点head的赋值;传进来head其实是没有带头结点的链表,
ListNode listnode = new ListNode(0);
        listnode.next = head;        
这里等于创建一个头结点listnode,然后listnode->next=head赋值把传进来的链表链接到头结点listnode上
柯莹 2016-05-15
  • 打赏
  • 举报
回复
我想问的是两个问题: 1、第一个代码中head = listnode; //这句话是什么意思? 2、第二个代码的错误处?

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧