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   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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!