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;
}
}
用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;
}
}
相关文章推荐
- 【Java每日一题】20161229
- 360每日自动签到,领取积分 (java httpclient4.x)
- 【每日工作-第一天、第二天】Java基础知识
- 【Java每日一题】20161208
- 每日一则JavaWeb---Spring的ResourceLoader的作用
- Java每日解惑
- 精通java之JVM详解(每日研读2次以上,对java理解必有提升)
- java每日一练
- 【Java每日一题】20161227
- 用java将bing每日壁纸设置为win7壁纸
- 每日一则JavaWeb---spring中非Controller层使用HttpServletRequest两种解决方案
- 【Java每日一题】20161228
- 【Java每日一题】20161129
- 牛客网每日打卡-Java基础-20160326
- java每日小算法(20)
- 【Java每日一题】20161012
- java每日小算法(22)
- 【Java每日一题】20161109
- 使用java将bing的每日壁纸设置为ubuntu壁纸