DoubleLinkList.java
import edu.princeton.cs.algs4.StdOut;
public class DoubleLinkList<Item> {
private class DoubleNode<Item>
{
private DoubleNode<Item> next = null;
private DoubleNode<Item> last = null;
private Item data;
}
private DoubleNode<Item> head = null;
public void push_back(Item item)
{
if (head == null)
{
head = new DoubleNode<Item>();
head.data = item;
return;
}
DoubleNode<Item> current = head;
while (current.next != null)
current = current.next;
current.next = new DoubleNode<Item>();
current.next.last = current;
current.next.data = item;
}
public void push_fore(Item item)
{
if (head == null)
{
head = new DoubleNode<Item>();
head.data = item;
return;
}
DoubleNode<Item> n_head = new DoubleNode<Item>();
n_head.data = item;
n_head.next = head;
head.last = n_head;
head = n_head;
}
public void display()
{
if (head == null)
return;
DoubleNode<Item> current = head;
while(current != null)
{
StdOut.print(current.data + " ");
current = current.next;
}
StdOut.println();
}
public void remove_fore()
{
if (head == null)
return;
if (head.next == null)
{
head = head.next;
return;
}
head = head.next;
head.last = null;
}
public void remove_back()
{
DoubleNode<Item> current = head;
while (current.next != null)
current = current.next;
current.last.next = null;
current.last = null;
}
public void insert_before(DoubleNode<Item> nnode,DoubleNode<Item> pos)
{
if (pos == null || nnode == null)
return;
if (pos == head)
{
nnode.next = pos;
pos.last = nnode;
head = nnode;
return;
}
nnode.next = pos;
pos.last.next = nnode;
nnode.last = pos.last.next;
pos.last = nnode;
}
public void insert_after(DoubleNode<Item> nnode,DoubleNode<Item> pos)
{
if (nnode == null || pos == null)
return;
nnode.next = pos.next;
nnode.last = pos;
pos.next = nnode;
}
public void remove_before(DoubleNode<Item> pos)
{
if (pos == null)
return;
if (pos == head)
return;
if (pos == head.next)
{
head = head.next;
return;
}
pos.last.last.next = pos;
pos.last = pos.last.last;
}
public void remove_after(DoubleNode<Item> pos)
{
if (pos == null || pos.next == null)
return;
if (pos.next.next == null)
{
pos.next = null;
return;
}
pos.next.next.last = pos;
pos.next = pos.next.next;
}
//辅助接口函数
public DoubleNode<Item> getPos(int i)
{
if (head == null)
return null;
if (i == 1)
return head;
int count = 1;
DoubleNode<Item> current = head;
while (current.next != null)
{
current = current.next;
if (++count == i)
return current;
}
return null;
}
public DoubleNode<Item> getNode(Item data)
{
DoubleNode<Item> ret = new DoubleNode<Item>();
ret.data = data;
return ret;
}
}
测试:main.java
import edu.princeton.cs.algs4.StdOut;
public class Main {
public static void main(String[] args)
{
DoubleLinkList<Integer> dl= new DoubleLinkList<Integer>();
for (int i = 1; i <= 10; ++i)
dl.push_back(i);
dl.push_fore(0);
dl.display();
dl.remove_back();
dl.remove_fore();
dl.display();
dl.remove_before(dl.getPos(2));
dl.remove_after(dl.getPos(3));
dl.display();
dl.insert_before(dl.getNode(1), dl.getPos(1));
dl.insert_after(dl.getNode(5),dl.getPos(4));
dl.display();
}
}