2 u011943359 u011943359 于 2016.01.22 10:52 提问

有关java的白痴问题,希望大神回答

Write a function to delete a node (except the tail) in a singly linked list, given only access to that node.

Supposed the linked list is 1 -> 2 -> 3 -> 4 and you are given the third node with value 3, the linked list should become 1 -> 2 -> 4 after calling your function.

/**

  • Definition for singly-linked list.
  • public class ListNode {
  • int val;
  • ListNode next;
  • ListNode(int x) { val = x; }
  • } */ public class Solution { public void deleteNode(ListNode node) { node=node.next; } } 不明白为什么这么赋值不可以。可不可以有大神系统的从原理讲解一下。

6个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.01.22 17:08
已采纳

可以直接赋值的,因为你的ListNode的成员变量都是default权限即包内访问的,只要你的ListNode和Solution类在同一个包里面就可以了。
你的删除方法有问题,先要查找到待删除节点,然后再删除。修正你的Solution代码如下:

 public class Solution {
    public void deleteNode(ListNode list,ListNode node) {
        //空链表
        if(node==null||list==null||list.getNext()==null){
            return ;
        }

        //查找node节点
        ListNode curNode = list;
        ListNode preNode = null;
        ListNode next = list.next;
        while(curNode!=null){
            if(curNode.val==node.val){//找到
                System.out.println("找到待删除对象了。"+node.val);
                break;
            }
            preNode = curNode;
            curNode = next;
            next = next.next;
        }


        //删除node节点 
        if(preNode==null){
            //第一个元素删除操作直接修正list为next:curNode-next
            list = next;
        }else{
            //删除中间节点中间:preNode-curNode-next
            preNode.next = next;
        }
    }

    public void printListNode(ListNode list){
        ListNode node = list;
        while(node!=null){
            System.out.println(node.val);
            node = node.next;
        }
    }

    public static void main(String[] args) {
        ListNode n1 = new ListNode(1);
        ListNode n2 = new ListNode(2);
        ListNode n3 = new ListNode(3);
        ListNode n4 = new ListNode(4);
        n1.setNext(n2);
        n2.setNext(n3);
        n3.setNext(n4);
        n4.setNext(null);
        Solution s = new Solution();
        s.printListNode(n1);
        s.deleteNode(n1, n3);
        s.printListNode(n1);
    }
}

Ok,测试结果

 1
2
3
4
找到待删除对象了。3
1
2
4
u011943359
u011943359 回复毕小宝: node是待删除节点,比如我想删除第三个节点,我是想把第四个节点的next指针还有val值给第三个节点,然后第三个节点就变为第四个节点了,第二个节点仍然指向第三个节点,而第三个节点内容变为第四个节点内容了,就直接指向了第五个节点,虽然删除的是第四个节点,但效果和删第三个节点一样。
2 年多之前 回复
wojiushiwo945you
wojiushiwo945you 回复小蜗牛1990: 写代码如果遵循java的基本编码规范,成员变量私有化,提供get/set方法;弄清楚链表删除操作的逻辑就好了。
2 年多之前 回复
wojiushiwo945you
wojiushiwo945you 回复小蜗牛1990: 你的node是什么节点呢,待删除的还是原来的列表顶点呢?删除元素为什么要修改其前驱结点的val值呢?
2 年多之前 回复
wojiushiwo945you
wojiushiwo945you 回复小蜗牛1990: node.next = node.next.next这个才是删除node后面的这个元素的操作,即删除了node.next的话,那么肯定需要将node.next指向带删除元素的next节点的。
2 年多之前 回复
u011943359
u011943359 Input: [0,1] node at index 0 (node.val = 0) Output: [0,1] Expected: [1]这是leetcode给我的报错信息
2 年多之前 回复
u011943359
u011943359 十分感谢!这个是leetcode上的一道题目,它默认传入deletenode的node就是要删除的node。所以不需要我完成链表的搭建,现在的问题是,如果我分开赋值。把node=node.next改为node.val = node.next.val; node.next = node.next.next; 这样的话程序就是可以跑通的。不明白这是为什么?我用node=node.next等于直接把node.next的地址传给node了,node就重新指向了node.next.next。等于直接把node.next删除掉了啊。为什么一定要分开赋值才可以通过。。。。
2 年多之前 回复
enpterexpress
enpterexpress   Rxr 2016.01.22 11:02

一个是对象的属性,一个是对象,怎么赋值呢

u011943359
u011943359 node.val = node.next.val; node.next = node.next.next; 我想让赋值实现这样的操作
2 年多之前 回复
u011943359
u011943359 但我next存的类型也是ListNode类型啊。
2 年多之前 回复
q3733353520
q3733353520   2016.01.22 11:40

你class的成员怎么可以是自己class类型的呢

Mr_dsw
Mr_dsw   Ds   Rxr 2016.01.22 12:28

线性连表问题,你先把定义搞懂

u011943359
u011943359 能不能麻烦稍微解释一下
2 年多之前 回复
baokx
baokx   2016.01.22 14:23

楼主应该是想实现一个链表吧,但是感觉楼主你的问题没有描述清楚,最好把完整代码,完整报错信息都贴出来。

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.01.22 17:09

补充:ListNode类提供next的get/set方法:

    public ListNode getNext(){
        return next;
    }

    public void setNext(ListNode next) {
        this.next = next;
    }
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
当面试官问你“你希望与什么样的上级共事?”如何回答?
招聘者目的是:通过应聘者对上级的“希望”可以判断出应聘者对自我要求的意识,这既上一个陷阱,又上一次机会。   应聘者应该做到:1、最好回避对上级具体的希望,多谈对自己的要求。2、作为刚步入社会的新人,我应该多要求自己尽快熟悉环境、适应环境,而不应该对环境提出什么要求,只要能发挥我的专长就可以了。
面试中如何回答“你期望的薪资是多少”?
面试中如何回答“你期望的薪资是多少”? 找工作是一个双向选择的事情。我们都只能把握自己,不能把握别人。唯一能做的就是努力提升自己,充实自己。 求职者在应聘之前首先应该对自己的综合工作能力有一个清楚的认识。 综合工作能力指学历,工作经验,年限,职位,目前工资水平,社交能力,沟通能力和团结协作能力 等等。 先对自己有一个清晰的认识,对自己的优缺点了熟于心,然后在
面试中,怎么回答或者问关于职业目标的问题
How to Not Ask or Answer Questions About Career Goals Share on LinkedIn Share on Facebook Share on Google Plus Share on Twitter The worst question about career goals is some
《三个白痴》经典语录_值得深思。
1、     A:“那天我明白了人心是很容易陷入恐惧的,你得哄哄它,无论问题有多大,告诉你的心,‘一切安然,朋友’”           B:“这就能解决问题?”           A:“不,但你增加了面对它的勇气!”           2、“这里他们不讨论新思想或发明,他们讨论成绩,工作, 定居美国。他们教怎样得高分却不教工程学”      3、“现在花一分钟来回顾一下你们的
面试:如何回答工作期望问题
工作期望是面试中一个必问问题之一。通常面试官都会问你想从工作中的到什么,或是你三到五年内的计划。那么,该如何回答这样的问题呢?下面两个案例会给你一点启示。Case OneInterviewer: What do you want most from your work?你最希望从工作中得到什么?Applicant: I hope to get a kind of learnin
人事经理常问的面试问题及答案
以下推荐给大家了解的面试问题是求职者们在面试时经常会被人事经理问到的,希望对大家以后的面试有帮助。 1. 请你谈谈你自己,或者做一个简短的自我介绍。 透过这个面试问题,招聘主管可以在很短的时间内了解你,也可以藉此看出你的表达能力、个性等。 应答技巧:直接切入重点,中肯的点出自己个性中的优点,如热诚、值得信赖等,不需要强力推销。此外,也可带出与应征工作的相关经验。 2. 为什
关于tuts4you注册中遇到的问题
tuts4you是一个非常好的国外关于逆向学习的网站然而注册tuts4you有一个很神奇的操作,最终判断人机操作的时候会有一串数字据分析应该是八进制数字,那么就需要对这串数字进行转换从而得出最终的问题是什么于是写了一个python# coding = utf-8 # author : Mr.BeanX # timestamp : 2018-1-18 code = raw_input('The c
英语基础写作及翻译经典句荟萃
英语基础写作及翻译经典句荟萃 1.A: In a word... 总之,…  In a word, money is something but not everything. 总之,金钱很重要,但它不是万能的.   B: In brief/short, ...,简言之,……. 1) In brief, we cannot please everyone all the tim
面试宝典集
有关Android面试和Java面试常见的问题,另有非技术型面试答案,例如:加班问题回答,工资问题回答,很全的喔
程序员进阶之路,转自知乎(作者:鼬自来晓)
 https://www.zhihu.com/question/19851109