为了我的个人实践,我正在尝试创建一个基本的、通用的双向链表,我想知道我创建的方法addtoHead()和addtoTail()是否正确和有效,如果不正确和有效,什么方法会更好?如何从removingDataAt()、removingFromTail()、removingFromHead()方法的列表中删除?
Node类:
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;
}
}链接列表类:
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 (){
//....
}
}发布于 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())
请记住检查链表中是否还有其他项。
发布于 2015-06-19 15:25:46
下面是双向链表的一个可靠实现:http://algs4.cs.princeton.edu/13stacks/DoublyLinkedList.java.html
Add方法看起来像这样:
// 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;
}这里要注意的是:
a> <b> <c> <e> <f> <g如果要添加d,请找到e并添加d
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;
}现在你应该已经拥有了:
a> <b> <c> <d> <e> <f> <ghttps://stackoverflow.com/questions/30930062
复制相似问题