问题
实现一个嵌套类DoubleNode用来构造双向链表,其中每个结点都含有一个指向前驱元素的引用和一个指向后续元素的引用(如果不存在则为null)。
为以下任务实现若干静态方法:
在头插入结点
在表尾插入结点
从表头删除结点
从表尾删除结点
在指定结点前插入新结点
在指定结点之后插入新结点
删除指定结点
代码:
package test;
public class DoubleList<Item> {
public static class DoubleNode<Item>
{
public Item item;
public DoubleNode<Item> next;//下一个节点
public DoubleNode<Item> prev;//上一个节点
}
private DoubleNode<Item> first;
private DoubleNode<Item> last;
public DoubleList()
{//构造函数,初始化链表
first=null;
last=null;
}
public static<Item> void insertAsFirst(DoubleList<Item> d1, Item e)
{
DoubleNode<Item> nodenew= new DoubleNode<Item>();
nodenew.item=e;
nodenew.next=d1.first;
nodenew.prev=null;
if(d1.first==null)
d1.last=nodenew;
else
d1.first.prev=nodenew;
d1.first=nodenew;
}
public static<Item> void insertAsLast(DoubleList<Item> d1,Item e)
{
DoubleNode<Item> nodenew=new DoubleNode<Item>();
nodenew.item=e;
nodenew.prev=d1.last;
nodenew.next=null;
if(d1.last==null)
d1.first=nodenew;
else
d1.last.next=nodenew;
d1.last=nodenew;
}
public static<Item> void deleteFirst(DoubleList<Item> d1)
{
if(d1.first==null)
return;
if(d1.first==d1.last)
{
d1.first=null;
d1.last=null;
}
else
{
d1.first=d1.first.next;
d1.first.prev.next=null;//释放连接
d1.first.prev=null;
}
}
public static<Item> void deleteLast(DoubleList<Item> d1)
{
if(d1.last==null)
return;
if(d1.last==d1.first)
{
d1.first=null;
d1.last=null;
}
else
{
d1.last=d1.last.prev;
d1.last.next.prev=null;
d1.last.next=null;
}
}
public static<Item> void insertBefore(DoubleList<Item> d1,DoubleNode<Item> node, Item e)
{
if(node==null) return;
if(d1.first==node) insertAsFirst(d1,e);
else
{
DoubleNode<Item> nodenew=new DoubleNode<Item>();
nodenew.item=e;
nodenew.next=node;
nodenew.prev=node.prev;
node.prev.next=nodenew;
node.prev=nodenew;//这个容易忘
}
}
public static<Item> void insertAfter(DoubleList<Item> d1,DoubleNode<Item> node, Item e)
{
if(node==null) return;
if(d1.last==node) insertAsLast(d1,e);
else
{
DoubleNode<Item> newnode=new DoubleNode<Item>();
newnode.item=e;
newnode.prev=node;
newnode.next=node.next;
node.next.prev=newnode;
node.next=newnode;
}
}
public static<Item> void deleteNode(DoubleList<Item> d1,DoubleNode<Item> node)
{
if(node==null) return;
else if(node==d1.first) deleteFirst(d1);
else if(node==d1.last) deleteLast(d1);
else
{
node.prev.next=node.next;
node.next.prev=node.prev;
node.prev=null;//释放连接
node.next=null;//释放连接
}
}
public static<Item> DoubleNode<Item> search(DoubleList<Item> d1,Item e)
{
DoubleNode<Item> newnode=d1.first;
while(newnode!=null)
{
if(newnode.item.equals(e))
return newnode;
newnode=newnode.next;
}
return null;
}
public static<Item> void print(DoubleList<Item> d1)
{
DoubleNode<Item> newnode=d1.first;
while(newnode!=null)
{
System.out.println(newnode.item);
newnode=newnode.next;
}
}
}
测试代码:
package test;
public class Q100331 {
public static void testInsertAsFirst()
{
System.out.println("--------------------");
System.out.println("testInsertAsFirst:");
DoubleList<String> dl = new DoubleList<String>();
DoubleList.insertAsFirst(dl, "a");
DoubleList.insertAsFirst(dl, "b");
DoubleList.insertAsFirst(dl, "c");
DoubleList.insertAsFirst(dl, "d");
System.out.println("After insert a, b, c, d:");
DoubleList.print(dl);
}
public static void testInsertAsLast()
{
System.out.println("--------------------");
System.out.println("testInsertAsLast:");
DoubleList<String> dl = new DoubleList<String>();
DoubleList.insertAsLast(dl, "a");
DoubleList.insertAsLast(dl, "b");
DoubleList.insertAsLast(dl, "c");
DoubleList.insertAsLast(dl, "d");
System.out.println("After insert a, b, c, d:");
DoubleList.print(dl);
}
public static void testInsertAsFirstAndLast()
{
System.out.println("--------------------");
System.out.println("testInsertAsFirstAndLast:");
DoubleList<String> dl = new DoubleList<String>();
DoubleList.insertAsLast(dl, "a");
DoubleList.insertAsLast(dl, "b");
DoubleList.insertAsLast(dl, "c");
DoubleList.insertAsLast(dl, "d");
DoubleList.insertAsFirst(dl, "1");
DoubleList.insertAsFirst(dl, "2");
DoubleList.insertAsFirst(dl, "3");
DoubleList.insertAsFirst(dl, "4");
System.out.println("After insertAsLast a, b, c, d and insertAsFirst 1, 2, 3, 4:");
DoubleList.print(dl);
}
public static void testDeleteFirst()
{
System.out.println("--------------------");
System.out.println("testDeleteFirst:");
DoubleList<String> dl = new DoubleList<String>();
DoubleList.insertAsLast(dl, "a");
DoubleList.insertAsLast(dl, "b");
DoubleList.insertAsLast(dl, "c");
DoubleList.insertAsLast(dl, "d");
System.out.println("list is: ");
DoubleList.print(dl);
System.out.println("After deleteFrist:");
DoubleList.deleteFirst(dl);
DoubleList.print(dl);
System.out.println("After deleteFrist again:");
DoubleList.deleteFirst(dl);
DoubleList.print(dl);
System.out.println("After deleteFrist again:");
DoubleList.deleteFirst(dl);
DoubleList.print(dl);
System.out.println("After deleteFrist again:");
DoubleList.deleteFirst(dl);
DoubleList.print(dl);
System.out.println("After deleteFrist again:");
DoubleList.deleteFirst(dl);
DoubleList.print(dl);
}
public static void testDeleteLast()
{
System.out.println("--------------------");
System.out.println("testDeleteLast:");
DoubleList<String> dl = new DoubleList<String>();
DoubleList.insertAsLast(dl, "a");
DoubleList.insertAsLast(dl, "b");
DoubleList.insertAsLast(dl, "c");
DoubleList.insertAsLast(dl, "d");
System.out.println("list is: ");
DoubleList.print(dl);
System.out.println("After deleteLast:");
DoubleList.deleteLast(dl);
DoubleList.print(dl);
System.out.println("After deleteLast again:");
DoubleList.deleteLast(dl);
DoubleList.print(dl);
System.out.println("After deleteLast again:");
DoubleList.deleteLast(dl);
DoubleList.print(dl);
System.out.println("After deleteLast again:");
DoubleList.deleteLast(dl);
DoubleList.print(dl);
System.out.println("After deleteLast again:");
DoubleList.deleteLast(dl);
DoubleList.print(dl);
}
public static void testSearch()
{
System.out.println("--------------------");
System.out.println("testSearch:");
DoubleList<String> dl = new DoubleList<String>();
DoubleList.insertAsFirst(dl, "a");
DoubleList.insertAsFirst(dl, "b");
DoubleList.insertAsFirst(dl, "c");
DoubleList.insertAsFirst(dl, "d");
System.out.println("List is :");
DoubleList.print(dl);
DoubleList.DoubleNode<String> node = DoubleList.search(dl, "c");
System.out.println("Search c: ");
if (node != null)
{
System.out.println("Find " + node.item);
}
else
{
System.out.println("Not found");
}
node = DoubleList.search(dl, "d");
System.out.println("Search d: ");
if (node != null)
{
System.out.println("Find " + node.item);
}
else
{
System.out.println("Not found");
}
node = DoubleList.search(dl, "a");
System.out.println("Search a: ");
if (node != null)
{
System.out.println("Find " + node.item);
}
else
{
System.out.println("Not found");
}
node = DoubleList.search(dl, "x");
System.out.println("Search x: ");
if (node != null)
{
System.out.println("Find " + node.item);
}
else
{
System.out.println("Not found");
}
}
public static void testInsertBeforeAndAfter()
{
System.out.println("--------------------");
System.out.println("testInsertBeforeAndAfter:");
DoubleList<String> dl = new DoubleList<String>();
DoubleList.insertAsLast(dl, "a");
DoubleList.insertAsLast(dl, "b");
DoubleList.insertAsLast(dl, "c");
DoubleList.insertAsLast(dl, "d");
System.out.println("List is :");
DoubleList.print(dl);
DoubleList.DoubleNode<String> node = DoubleList.search(dl, "c");
DoubleList.insertAfter(dl, node, "C");
System.out.println("After insert C after c:");
DoubleList.print(dl);
node = DoubleList.search(dl, "d");
DoubleList.insertAfter(dl, node, "D");
System.out.println("After insert D after d:");
DoubleList.print(dl);
node = DoubleList.search(dl, "c");
DoubleList.insertBefore(dl, node, "B");
System.out.println("After insert B before c:");
DoubleList.print(dl);
node = DoubleList.search(dl, "a");
DoubleList.insertBefore(dl, node, "A");
System.out.println("After insert A before a:");
DoubleList.print(dl);
}
public static void testDeleteNode()
{
System.out.println("--------------------");
System.out.println("testDeleteNode:");
DoubleList<String> dl = new DoubleList<String>();
DoubleList.insertAsLast(dl, "a");
DoubleList.insertAsLast(dl, "b");
DoubleList.insertAsLast(dl, "c");
DoubleList.insertAsLast(dl, "d");
System.out.println("List is :");
DoubleList.print(dl);
DoubleList.DoubleNode<String> node = DoubleList.search(dl, "c");
DoubleList.deleteNode(dl, node);
System.out.println("After delete c:");
DoubleList.print(dl);
node = DoubleList.search(dl, "a");
DoubleList.deleteNode(dl, node);
System.out.println("After delete a:");
DoubleList.print(dl);
node = DoubleList.search(dl, "d");
DoubleList.deleteNode(dl, node);
System.out.println("After delete d:");
DoubleList.print(dl);
}
public static void main(String[] args)
{
// testInsertAsFirst();
// testInsertAsLast();
// testInsertAsFirstAndLast();
// testDeleteFirst();
// testDeleteLast();
// testSearch();
testInsertBeforeAndAfter();
// testDeleteNode();
}
}
参考:大神博客