从链表中删除节点

时间:2016-10-14 07:36:17

标签: java linked-list

class StackNode{
    int data;
    StackNode next;

    public StackNode(int data, StackNode next){
        this.data = data;
        this.next = next;
    }
}

public class StackWithLinkedList {

    StackNode root = null;

    public void push(int data){
        if(root == null)
            root = new StackNode(data, null);
        else {
            StackNode temp = root;
            while(temp.next != null)
                temp = temp.next;

            temp.next = new StackNode(data, null);
        }
    }

    public int pop() throws Exception{
        if(root == null)
            throw new Exception("No Elements in Stack");
        else {
            StackNode temp = root;
            while(temp.next != null)
                temp = temp.next;
            int data = temp.data;
            temp = null;
            return data;
        }
    }


    public void print(){
        StackNode temp = root;
        while(temp!= null){
            System.out.print(temp.data +" ");
            temp = temp.next;
        }
        System.out.print("\n");
    }

    public static void main(String[] args) {
        StackWithLinkedList stack = new StackWithLinkedList();
        for(int i = 1; i<=15; i++){
            Random randomGen = new Random();
            stack.push(randomGen.nextInt(i));
        }
        stack.print();
        System.out.print("\n");
        try {
            System.out.println("Deleted: "+stack.pop());
            System.out.println("Deleted: "+stack.pop());
        } catch (Exception e) {
            e.printStackTrace();
        }
        stack.print();
    }
}

我正在尝试使用Linkedlist实现Stack。在pop函数中,我遍历到最后一个节点并使其为null。当我打印列表时。它保持不变。是否将root分配给temp并遍历它会导致任何问题?

3 个答案:

答案 0 :(得分:3)

您可以通过简化实施来避免这一切。它只是一堆,所以它是LIFO。您需要做的就是将最后一个元素x设为var。当push - 返回root中的pop并将data设置为下一行时。

您执行该操作的方式会增加rootroot操作的O(1)O(N)的典型复杂性。

类似的东西:

push

答案 1 :(得分:2)

正如@ChiefTwoPencils在其他答案中所提到的,这必须是实现这一点的首选方式。但是,要纠正弹出操作的逻辑,您应该跟踪倒数第二个项目,一旦得到它,您可以返回下一个节点的数据值,并将下一个链接设置为null。

这是从你的pop方法代码改变逻辑

     public int pop() throws Exception{
        if(root == null)
            throw new Exception("No Elements in Stack");
        else {
            int data = -1;
            if(root.next==null) {
                data = root.data;
                root = null;
                return data;
            }

            StackNode temp = root;
            while(temp.next.next != null)
                temp = temp.next;
            data = temp.next.data;
            temp.next = null;
            return data;
        }
    }

希望它有所帮助。

答案 2 :(得分:0)

public int pop() throws Exception{
   if(root == null)
       throw new Exception("No Elements in Stack");
   else {
       StackNode temp = root;
       StackNode prev;
       while(temp.next != null){
           prev = temp;
           temp = temp.next;
       }
       int data = temp.data;
       prev.next = null;
       return data;
   }

}