无法删除链接列表

时间:2016-11-05 07:13:33

标签: java

我看到了一些解决方案,但我仍无法解决代码中的错误。我的deleteFromStart方法不会从列表中删除任何元素。 ob.display()的两次调用都产生相同的输出。你能告诉我我错过了什么,或者错误在哪里吗?

LikedList:

package lab5;

public class LinkedList {

    public static void main(String argsp[]){

        List ob = new List();

        ob.addAtStart("y", 6);
        ob.addAtStart("w", 4);
        ob.addAtStart("z", 3);

        ob.addAtEnd("a",3);
        ob.addAtEnd("b",4);
        ob.addAtEnd("c",5);

        ob.display();

        ob.deleteFromStart();

        System.out.println("\n");
        ob.display();
    }
}

列表:

package lab5;

public class List {

    Node head;

    public List(){
        head=null;
    }

    public List(Node e){
        head=e;
    }

    Node oldfirst=null;
    Node lasthead=null;

    public void addAtStart(String name, int age){
        Node newObject= new Node(name,age);
        newObject.next=head;

        if (oldfirst==null) {
            oldfirst = newObject;
        }
        head = newObject;
        lasthead = head;
    }

    public void display() {
        Node store = head;
        while (store != null) {
            store.display();
            store=store.next;
            System.out.println();
        }
    }

    public void addAtEnd(String name, int age){
        Node atEndValue = new Node(name, age);
        oldfirst.next = atEndValue;
        oldfirst = atEndValue;
    }

    public void deleteFromStart() {
        while (lasthead != null) {
            lasthead = lasthead.next;
        }
    }

    public boolean isEmpty() {
        return head == null;
    }

节点

package lab5;

public class Node {

    String name;
    int age;
    Node next;

    public Node(){
        name="Abc";
        age=10;
        next=null;
    }

    public Node(String name, int age ){
        this.name=name;
        this.age=age;
        next = null;
    }

    public void display(){
        System.out.println("Name: " + name + " Age: " + age);
    }
}

3 个答案:

答案 0 :(得分:3)

tl; dr 要删除链接列表中的第一个元素:

head = head.next

当您实施单链表时,您实际上只需要保留一个指针:head(即对列表中第一个节点的引用。实际上,它是' s也可用于跟踪列表中的最后一个元素(通常称为tail)。这允许在列表末尾进行常量操作,如果您经常添加元素,这将非常有用最后,通过这个基本实现,您最终会得到类似的结果:

class LinkedList {
    private Node head = null;
    private Node tail = null;

    public LinkedList() {}

    public LinkedList(Node e) {
        head = e;
        tail = e;
    }
}

class Node {
    Node next = null;
    // other data
}

添加和删除链接列表中的元素可归结为更新headtail变量所指的内容。考虑一个包含三个元素[A, B, C]的单链表。值headtail值的对齐方式如下:

 A -> B -> C -> null
 ^         ^
 |         |
head      tail

如果要插入新元素X,则有两个步骤:

1)告诉X.next引用A

X -> A -> B -> C -> null
     ^         ^
     |         |
    head      tail

2)更新head以引用X

 X -> A -> B -> C -> null
 ^              ^
 |              |
head           tail

您以类似的方式移动headtail,具体取决于您是否添加或删除操作,以及操作是否位于列表的开头或结尾。< / p>

从一开始就删除元素(假设列表不为空)就像更新head以引用下一个元素一样简单。在上面的示例中,这意味着移动head以引用X.nextA

X -> A -> B -> C -> null
     ^         ^
     |         |
    head      tail

现在请记住,链接列表只能直接了解headtail,因此,一旦您更新head以引用A,就没有任何引用{{1}在您的应用程序中的任何地方,它已被有效删除(在Java中,这将导致它被垃圾收集)。

有效地,我们上面所做的只是X。同样,您必须首先确保列表不是空的,因为如果列表为空,head = head.next将导致空指针异常。

我还建议删除head.nextoldfirst,并根据上述理论更新lasthead *方法。

答案 1 :(得分:0)

这实际上不是一个链接列表,它更像是一个有后部和前部指针的队列。 在显示列表中的项目时,您使用的是“head”指针,而从开始删除时您使用的是“lasthead”。这将移动最后一个但不会再将值分配给头部。

 public void deleteFromStart(){

    while(lasthead!=null){

        this.lasthead=lasthead.next;
    }
    head = this.lasthead;
}

我尝试了这段代码,从一开始就删除了所有元素(我希望这是你想要的)

删除第一个元素:

public void deleteElementAtStart()
{
    if(lasthead != null)
    {
        this.lasthead = lasthead.next;
    }
    else
    {
        System.out.println("List is already empty!");
    }
    head = lasthead;
}

编辑它。

答案 2 :(得分:0)

谢谢大家!我意识到我的错误,我正在使用额外的对象,这就是为什么在解决方案中我得到了这两种方法。

public void deleteFromStart(){


        while(lasthead.next!=null){
            lasthead=lasthead.next;
            head=lasthead;
            break;
        }

    }

public void deleteFromStart(){

            while(head.next!=null){
                head=head.next;
                break;
            }

    }