deleteNode有问题

时间:2016-03-06 13:48:54

标签: java algorithm data-structures

我的问题是lintcode中的练习需要delet节点,但由于某种原因我的简单程序不起作用。

例如,输入(1-> 2-> 3-> 4-> null,3)应该输出(1-> 2-> 4-> null),我的想法是删除下一个节点并“复制”其值以输入THIS节点。

/**
 * Definition for ListNode.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int val) {
 *         this.val = val;
 *         this.next = null;
 *     }
 * }
 */ 
public class Solution {
    /**
     * @param node: the node in the list should be deleted
     * @return: nothing
     */
    public void deleteNode(ListNode node) {
        // write your code here
        ListNode pnext;
        if (node != null) {
            if (node.next != null) {
                ListNode tempnode = node.next;
                if (node.next.next != null) {
                    pnext = node.next.next;
                }
                else {
                    pnext = null;
                }

                node.next = null; //delete next node
                node = tempnode; // give next node to THIS node
                node.next = pnext; // link next
            }
        }
        else node = null;
    }
}

我对为节点赋值感到非常困惑,node1 = node2甚至可以工作吗?我知道node.val可以。有人可以简单地指导我吗?

3 个答案:

答案 0 :(得分:0)

你不必要地使它变得复杂,并不是那么艰难。如我所见,您只是将ListNode作为参数,而不是要删除的data。此外,由于您使用的是if而不是whilefor,因此您永远不会最终迭代整个列表。

您应修改您的函数以同时使用nodedata并开始使用循环来迭代完整列表。

以下是代码段:

private void deleteNode(ListNode node, int data) {
    while(node != null && node.data != data) {
        node = node.next;
    }

    if(node != null) {
        System.out.println("Deleted Node With Data: " + node.data);
        node = node.next;
    }
}

答案 1 :(得分:0)

您没有在帖子中包含实际发生的事情,并且您没有包含创建列表的部分,因此我只能假设您不删除3,但删除4?或者它根本不删除任何内容?

所以你有一个方法应该删除一个节点,你要删除的节点作为参数给出。但是,由于您的列表仅以一种方式链接,因此您无法确定它之前的节点(它保存对您要删除的节点的引用)。实际上删除方法应该像这样简单:

public void deleteNextNode(ListNode node) {
    if(node == null || node.next == null) return; //nothing to delete
    if(node.next.next == null){
        node.next = null;
        return;
    } else{
        node.next = node.next.next;
    }
}

虽然我没有测试过。只要您不存储任何其他对节点的引用,这就足够了,否则您需要在else部分中明确地调用next.null。

编辑:我的功能会删除您传递的节点后面的节点,但您需要一个删除传递它的节点的功能。这里的问题是前一个节点存储了您要删除的节点的引用,但是您无法确定该节点仅包含您要删除的节点的引用。因此要么使用此函数并始终传递上一个节点,要么创建包装函数并运行列表并始终保护前一个节点并使用该节点调用该函数:

public ListNode deleteNode(ListNode start, ListNode deleteMe)
{
    ListNode prev = start;
    if(start == deleteMe) return start.next;
    while(prev.next != null) {
        if(prev.next == deleteMe)
            deleteNextNode(prev);
        prev = prev.next;
    }
    return start;
}

请注意,我使函数返回ListNode,这始终是List的第一个节点(如果您决定删除第一个节点)。 我希望这有帮助

答案 2 :(得分:0)

我想:

node = tempNode; // give next node to THIS node.

你的意思是:

node.val = tempNode.val; // give next node value to THIS node.

这样,下一个节点的值被复制到当前节点。 接下来你还想做:

node.next = tempNode.next;

这样,节点有效地成为tempNode。我想这是你的意图..?