您的位置:首页 > 编程语言 > Java开发

Java每日一题(6)

2009-09-28 22:31 309 查看
题目:
用Java实现一个完整的双向链表类,并向外提供头、尾节点的增删操作,任意节点的增删操作,获取任意节点,并且要求链表能以字符形式进行输出!

答:

/**
*
*/
package util;

/**
* 这个一个完整的双向链表,通过private私有化基础的链表操作,通过public包装向外暴露操作柄。
* @author daniel zhou
*
*/
public class DoubleLinkedListTest {

/**
* The Test in main should not test in a time!
* @param args
*/
public static void main(String[] args) {
DoubleLinkedList dll = new DoubleLinkedList();
//Initialize
dll.add("HH");
dll.add("II");
dll.add("JJ");
System.out.println(dll);

//add first
dll.addFirst("AA");
System.out.println(dll);

//add last
dll.addLast("ZZ");
System.out.println(dll);

//add in some location
dll.add(4, "Daniel");
System.out.println(dll);

//remove first node
dll.removeFirst();
System.out.println(dll);

//remove last node
dll.removeLast();
System.out.println(dll);

//remove node in some index
dll.remove(2);
System.out.println(dll);

//get the node of some index
System.out.println(dll.get(1));
}
}

class DoubleLinkedList{

//Node class
public class Node{
//Attribute of the node
Object value;
Node prev=this;
Node next=this;
//construct
public Node(Object value){
this.value=value;
}
//to String
public String toString(){
return value.toString();
}
}

//Attributes of the DoubleLinkedList
private Node head=new Node(null);
private int size;

//base operate of the doubleLinkedList
private void addBefore(Node newNode, Node node){
newNode.prev=node.prev;
newNode.next=node;
newNode.prev.next=newNode;
newNode.next.prev=newNode;
size++;
}

private void addAfter(Node newNode, Node node){
newNode.prev=node;
newNode.next=node.next;
newNode.prev.next=newNode;
newNode.next.prev=newNode;
size++;
}

private void removeNode(Node node){
node.prev=null;
node.next=null;
node.prev.next=node.next;
node.next.prev=node.prev;
size--;
}
//get the node of index
private Node getNode(int index){
//validate
if (index<0 || index>=size) {
throw new IndexOutOfBoundsException("Index out of bounds!");
}
Node node = head.next;
for (int i = 0; i < index; i++)
node = node.next;
return node;
}
//For print this linkedlist
public String toString(){
StringBuffer sb=new StringBuffer("{");
Node node=head;
for (int i = 0; i < size; i++) {
node=node.next;
if (i>0) {
sb.append(",");
}
sb.append(node.value);
}
sb.append("}");
return sb.toString();
}

//Easy use operate handler of the link
//Add
public boolean addLast(Object o) {
addBefore(new Node(o), head);
return true;
}

public boolean addFirst(Object o)
{
addAfter(new Node(o), head);
return true;
}

public boolean add(int index, Object o)
{
addBefore(new Node(o), getNode(index));
return true;
}

public boolean add(Object o)
{
return addLast(o);
}
//remove
public boolean removeLast()
{
removeNode(head.prev);
return true;
}

public Object get(int index)
{
return getNode(index).value;
}

public boolean remove(int index)
{
removeNode(getNode(index));
return true;
}

public boolean removeFirst()
{
removeNode(head.next);
return true;
}

//tool
public int getSize(){
return size;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息