双重链接列表 - 头部正在改变而不改变它

时间:2017-02-11 05:32:54

标签: java linked-list doubly-linked-list

问题在于我在DLinkedList类中的findA方法。 该方法显然改变了我的head.next指向tmp.next 我创建了一个列表{0,1,2,3,4,5,6,7,8,9} 我用了

  

findA(9)

并且我的列表缩小到{9},尽管函数给出了正确的结果,无论给定的值是否在我的列表中(true或false)

另一方面,我的find方法运行完美,两者之间的唯一区别是我在findA中使用Node tmp = head 和找到

中的节点tmp = head.next

以下是完整的代码段。我意识到一些实现是非常不专业的。对此有任何意见将不胜感激

public class Node <T extends Comparable<T>> {
T data;
Node prev;
Node next;

Node(){
}

Node(T val){
    data = val;
}  }

public class DLinkedList<T extends Comparable<T>> {
Node head;
Node tail;

DLinkedList(){
    head = new Node();    
    tail = new Node();
    tail.prev = head;
}

void insertInOrder(T value){
    Node insert = new Node(value);
    if(head.next==null){
        head.next = insert;
        insert.prev = head;
        insert.next = tail;
        tail.prev = insert;
    }
    else{
        insert.prev = tail.prev;
        tail.prev.next = insert;
        tail.prev = insert;
        insert.next = tail;
    }
}

boolean find (T value){
    boolean result = false;
    Node tmp = head.next;
    if (head!=null){
        while(tmp!=null){
            if(tmp.data.compareTo(value)!=0){
                tmp = tmp.next;
            }
            else{
                result = true;
                break;
            }
        }
    }
    return result;
}

 boolean findA (T value){
    boolean result = false;
    Node tmp = head;
    if (head!=null){
        while(tmp.next!=null){
            if(tmp.next.data.compareTo(value)!=0){
                tmp.next = tmp.next.next;
            }
            else{
                result = true;
                break;
            }
        }
    }
    return result;
}

void deleteA(T value){
    Node tmp = head.next;

    while(tmp.data.compareTo(value)!=0){
            tmp = tmp.next;
    }
    if(tmp!=tail){
        if(tmp==head.next)
            head = tmp.next;
        else
             tmp.prev.next = tmp.next;

        if (tmp==tail)
            tail = tmp.prev;
        else
            tmp.next.prev = tmp.prev;
    }






}
void delete(T value){
    Node tmp = head.next;
    if(find(value)){
        while(tmp!=tail){
            if(tmp.data.compareTo(value)!=0){
                tmp = tmp.next;
            }
            else{
                tmp.prev.next = tmp.next;
                tmp.next.prev = tmp.prev;

                break;
            }
        }            
    }
}

@Override
public String toString(){
    Node tmp = head.next;
    String result = "";
        while(tmp!=tail){
            System.out.println(tmp.data);
            tmp = tmp.next;
        }
    return result;
}  }

public class ListCheck {

public static void main(String[] args) {
    DLinkedList list = new DLinkedList();
    DLinkedList listA = new DLinkedList();
    for(int i=0; i<10; i++){
        list.insertInOrder(i);
        listA.insertInOrder(i);
    }
    System.out.println(listA.findA(9));
    System.out.println(list.find(9));  
    listA.toString();
    System.out.println("");
    list.toString();
} }

1 个答案:

答案 0 :(得分:0)

在你的findA中,你移动tmp的方式是做

tmp.next = temp.next.next

以这种方式破坏当前指针并将其重新路由到下一个节点(java的浅拷贝):

tmp--->[node1]--->[node2]更改为tmp--->[node2]

因此,在操作结束时,您的链表仅剩下最后一个节点。

将其更改为tmp = tmp.next会有所帮助