对象方法不在对象内部工作但在外部工作?

时间:2018-03-21 00:57:34

标签: java oop object

我一直在创建一个链表列表程序,它使用的节点对象只包含一个int和一个对下一个节点的引用。我尝试在列表类中实现的方法之一是将已经创建的一个列表链接到另一个列表的最后一个元素,从而链接'它们彼此之间,以便它是一个融合在一起的长链节点。

然而,尽管我的所有语法都是正确的,但对我来说,以下方法对我来说并不合适,这很奇怪。任何帮助将不胜感激。

 if(found) {
            //System.out.println("found one!");
            if(k == head) {
                head = k.next();
            }
            else if(k == tail) {
                bk.setNext(null);
                tail = bk;
            }
            else {
                  bk.setNext(k.next());
                  k = k.next();
            }

正如您所看到的,问题出在addTail2方法中。

***** EDIT ***** 问题解决了,我的delAll方法正在删除尾部引用,就好像我已经删除了DelAll(20)的尾部而没有if语句来处理被移除的节点是否为Tail。我不小心。只需用

附加delAll即可
{{1}}

现在一切都很完美

记住小孩,在处理linkedLists时,确保对您的头/尾的引用 始终 有效,无论您在修改时处理的是什么情况列表

1 个答案:

答案 0 :(得分:0)

这是我的代码,因为我已根据您的提交构建它:这似乎有效

public class LinkedListHT {
    private Node head = null; 
    private Node tail = null;

    public LinkedListHT() {
        // empty constructor
    }

    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        Node nd = head;
        String separator = "";
        while (nd != null) {
            sb.append(separator);
            sb.append(nd.getData());
            separator = ", ";
            nd = nd.getNext();
        }
        sb.append("]");
        return sb.toString();
    }

    public void addHead(int x) {
        //insert x at head of list
        Node nw = new Node(x);
        if(head == null){
            head = nw; tail = nw;
        } else {
            nw.setNext(head);
            head = nw;
        }
    }

    public void addTail(int x){ //add at head
        Node nw = new Node(x);
        if(head == null) {
            head = nw;
            tail = nw;
        } else {
            tail.setNext(nw);
            tail = nw;
        }
}

    public void addTail2(LinkedListHT lst){
        Node k = lst.head;
        while (k != null) {
            System.out.println("Now adding " + k.getData());
            this.addTail(k.getData());
            System.out.println(this);
            k = k.getNext();
        }
    }
}

节点对象,我根据公认的惯例使代码更多了

public class Node {
    private int data = 0;
    private Node next = null;

    public Node(int x) {
        data = x;
    }

    public Node getNext() {
        return next;
    }

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

    public void setData(int data) {
        this.data = data;
    }

    public int getData() {
        return data;
    }
}

最后是控制器类

public class LinkedListTest {

    public LinkedListTest() {
        LinkedListHT lst1 = new LinkedListHT();
        lst1.addHead(431);
        lst1.addHead(50);
        lst1.addHead(10);
        lst1.addHead(60);
        lst1.addHead(70);
        LinkedListHT lst2 = new LinkedListHT();
        lst2.addHead(19);
        lst2.addHead(45);
        lst2.addHead(12);
        lst2.addHead(64);
        lst1.addTail2(lst2);
        System.out.println(lst1);

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new LinkedListTest();
    }
}

输出

Now adding 64
[431, 50, 10, 60, 70, 64]
Now adding 12
[431, 50, 10, 60, 70, 64, 12]
Now adding 45
[431, 50, 10, 60, 70, 64, 12, 45]
Now adding 19
[431, 50, 10, 60, 70, 64, 12, 45, 19]
[431, 50, 10, 60, 70, 64, 12, 45, 19]