首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用双向链表

通用双向链表
EN

Stack Overflow用户
提问于 2015-06-19 12:45:52
回答 2查看 6.5K关注 0票数 1

为了我的个人实践,我正在尝试创建一个基本的、通用的双向链表,我想知道我创建的方法addtoHead()和addtoTail()是否正确和有效,如果不正确和有效,什么方法会更好?如何从removingDataAt()、removingFromTail()、removingFromHead()方法的列表中删除?

Node类:

代码语言:javascript
复制
public class PracticeNode<T> {

private T data;
private PracticeNode<T> next;
private PracticeNode<T> prev;

PracticeNode() {
    next = null;
    prev = null;
    data = null;
}

PratciceNode(T data) {

this(data, null, null);

}

PracticeNode(T data, PracticeNode<T> next, PracticeNode<T> prev) {
    this.data = data;
    this.next = next;
    this.prev = prev;
}

public void setNextNode(PracticeNode<T> next) {
    this.next = next;
}

public void setPrevNode(PracticeNode<T> prev) {
    this.prev = prev;
}

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

public PracticeNode<T> getNextNode() {
    return next;
}
public PracticeNode<T> getPrevNode() {
    return prev;
}

public T getData() {
    return data;
}

}

链接列表类:

代码语言:javascript
复制
public class PracticeLinkedList<T> {

private PracticeNode<T> head;
private PracticeNode<T> tail;

public void addtoHead(T data ) {
    PracticeNode<T> newnode=new PracticeNode<T>();
    if(head==null){
        head=newnode;
        tail=newnode;
        newnode.setNextNode(null);
        newnode.setPrevNode(null);
    }else{
         newnode.setNextNode(head);
         head.setPrevNode(newnode);
         head=newnode;
    }

}

public void addToTail(T data) {
    PracticeNode<T> newnode=new PracticeNode<T>();
     if(tail==null){
            head=newnode;
            tail=newnode;
            newnode.setNextNode(null);
            newnode.setPrevNode(null);
        }else{
            newnode.setPrevNode(tail);
            tail.setNextNode(newnode);
            tail=newnode;
        }


}

public T removingDataAt (int){
    //....
}

public T removingFromTail (){
    //....
}

public T removingFromHead (){
    //....
}
}
EN

回答 2

Stack Overflow用户

发布于 2015-06-19 15:19:16

我觉得addToTail看起来不错。

对于removingDataAt()removingFromTail()removingFromHead(),您想要执行与addToTail和addToHead相同的操作。因为这看起来像是一个赋值的东西,所以我不会给出完整的代码,而只是告诉你如何做。

我看到你只有head和tail的导航实例,我建议你还实现一个'current‘,它允许你在列表中导航来做一些事情,比如removingDataAt(location)。我不确定删除东西的最有效的方法,但是在Java中,它会自动执行垃圾收集,所以您可以使用head = head.getNextNode()简单地从头部删除。从tail中删除也是一个类似的故事。

对于removingDataAt(),您首先需要一种方法来查找数据数据,除非用户已经知道列表的每个位置中有什么。也许是像find(object)这样的东西,它会在失败时返回错误消息,否则会将“当前”实例移到找到的对象中。您可以使用如下代码来实现它:

for(current = head; current!=null; current = current.getNextNode())

请记住检查链表中是否还有其他项。

票数 2
EN

Stack Overflow用户

发布于 2015-06-19 15:25:46

下面是双向链表的一个可靠实现:http://algs4.cs.princeton.edu/13stacks/DoublyLinkedList.java.html

Add方法看起来像这样:

代码语言:javascript
复制
   // add element to list 
    public void add(Item item) {
        Node x = current.prev;
        Node y = new Node();
        Node z = current;
        y.item = item;
        x.next = y;
        y.next = z;
        z.prev = y;
        y.prev = x;
        N++;
        index++;
        lastAccessed = null;
    }

这里要注意的是:

代码语言:javascript
复制
a> <b> <c> <e> <f> <g

如果要添加d,请找到e并添加d

代码语言:javascript
复制
    public void add(Item item) {
        Node x = current.prev; //new before element : c
        Node y = new Node();   //new node to store element
        Node z = current;      //new after element : e
        y.item = item;         //store value to the node : d.value=value
        x.next = y;            //link before element next : c>
        y.next = z;            //link element next  : d>
        z.prev = y;            //link after element previous : <e
        y.prev = x;            //link after element previous : <d
        N++;                   //increase number of elements on list counter
        index++;               //increase current position number 
        lastAccessed = null;
    }

现在你应该已经拥有了:

代码语言:javascript
复制
a> <b> <c> <d> <e> <f> <g
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30930062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档