【问题标题】:Delete first node in a LinkedListNode删除 LinkedListNode 中的第一个节点
【发布时间】:2013-04-03 18:39:35
【问题描述】:

我以为我有这个程序可以运行,但不幸的是我忽略了一些东西。如何删除第一个节点并将第二个节点转换为链表的前面。我尝试了多种方法,但最终得到相同的结果。(LinkedList 保持不变)任何指导将不胜感激。

节点类

public class Node {

    private String data;
    private Node next;

    Node(String data, Node next)
    {
        this.data = data;
        this.next = next;
    }

    public void setData(String d)
    {
        data = d;
    }

    public void setNext(Node n)
    {
        next = n;
    }

    public String getData()
    {
        return data;
    }

    public Node getNext()
    {
        return next;
    }

主要

public static void main(String[] args) {

        Node list = new Node("NODE 1",new Node("NODE 2",new Node("NODE 3", null)));
        list = insertSecond(list,"New Node");
        list = addLast(list,"LAST NODE");

        printList(list);
        System.out.println();
        deleteNode(list, "NODE 1");
        printList(list);
    }

    public static Node deleteNode(Node list,String str)
    {
        Node temp = list;
        Node prev = list;

        while(temp != null)
        {
            if(temp.getData().equals(str))
            {
                if(temp.getData().equals(list.getData()))
                    {
                    list = list.getNext();
                    return deleteNode(list,str);
                    }
                else
                    {
                        prev.setNext(prev.getNext().getNext());
                    }
            }
            prev = temp;
            temp = temp.getNext();

        }

        return list;

【问题讨论】:

  • 虽然这在技术上是一个节点列表,但最好有一个 NodeList 类来保持对列表头部和尾部的引用。然后你可以将 head 引用指向head.next 元素
  • 我在stackoverflow.com/questions/15792682/…的回答中回答了这个问题
  • Dwb 你做了,你的解释在它背后的理论中很清楚,但我不能用适当的语法来删除第一个节点并使下一个节点成为头。

标签: java linked-list nodes


【解决方案1】:

你的deleteNode 函数应该返回新列表的头部。这仅在您描述的一种极端情况下是必需的 - 删除该列表的头部。

list = deleteNode(list, str);

另外你不需要递归执行deleteNode方法,迭代节点元素就足够了:

public static Node deleteNode(Node list, String str) {
    // I'm assuming that you are deleting the first inscance of the string
    Node temp = list;
    Node prev = list;

    while(temp != null) {
        if(temp.getData().equals(str)) {
            if(temp.getData().equals(list.getData())) {
                return list.getNext();
            }
            else {
                prev.setNext(temp.getNext());
                return list;
            }
        }
        prev = temp;
        temp = temp.getNext();
    }

    return list;
}

【讨论】:

  • 你是对的我错过了返回类型但它仍然没有效果。
  • 是的,你是对的。我想说的是您的实现没有正确处理这种边缘情况。
  • 这种方法不会在没有实际删除的情况下返回位置[n]处的列表吗?
  • 不(;它正在返回列表头。如果删除第一个节点,则返回第二个节点,在任何其他情况下,我们将加入节点,忽略应该删除的节点并返回列表头。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
相关资源
最近更新 更多