LinkLis javat的实现 双向链表的实现

来源:互联网 发布:专业制谱软件 编辑:程序博客网 时间:2024/06/03 18:50

package com.link;
public class LinkedList<T> {
 LinkNode<T> header = null;
 LinkNode<T> last = null;
 public LinkNode<T> getFirstNode(){
  return header;
 }
 public  LinkNode<T> getLastNode(){
  return last;
 }
 public T getHeaderValue() {
  return header.getNodeValue();
 }
 public T getTailValue() {
  return last.getNodeValue();
 }
 int size = 0;
 /**
  * 追加元素,从最后一个元素追加
  * @param t 要追加的元素
  */
 public void add(T t){
  LinkNode<T> n = new LinkNode<T>();
  n.setNodeValue(t);
  if(header == null){
   header = n;
   last = n;
  }
  header.setPreviousNode(n);
  n.setNextNode(header);
  n.setPreviousNode(last);
  last.setNextNode(n);
  last = n;
  size++;
 }
 /**
  * 添加元素
  * @param t 要添加的对象
  * @param index 索引,从0开始
  * @throws Exception
  */
 public void add(T t,int index) throws Exception{
  LinkNode<T> nodeNext = getElement(index);
  LinkNode<T> node = nodeNext.getPreviousNode();
  LinkNode<T> newNode = new LinkNode<T>();
  newNode.setNodeValue(t);
  nodeNext.setPreviousNode(newNode);
  node.setNextNode(newNode);
  newNode.setNextNode(nodeNext);
  newNode.setPreviousNode(node);
  if(index == 0){
   header = newNode;
  }
  size++;
 }
 /**
  * 根据索引移除元素
  * @param index 要移除元素的索引
  * @throws Exception
  */
 public void remove(int index) throws Exception{
  LinkNode<T> currenNode = getElement(index);
  LinkNode<T> previousNode = currenNode.getPreviousNode();
  LinkNode<T> nextNode = currenNode.getNextNode();
  previousNode.setNextNode(nextNode);
  nextNode.setPreviousNode(previousNode);
  if(index == 0){
   header = nextNode;
  }
  if(index == size -1){
   last = previousNode;
  }
  currenNode = null;
  size--;
 }
 /**
  * 根据索引获取节点元素
  * @param index
  * @return
  * @throws Exception
  */
 public LinkNode<T> get(int index) throws Exception{
  return getElement(index);
 }
 public int getSize(){
  return size;
 }
 /**
  * 清除所有元素
  */
 public void clear(){
  LinkNode<T> node = header.getNextNode();
  while (node != header) {
   LinkNode<T> next = node.getNextNode();
   node.setNextNode(null);
   node.setPreviousNode(null);
   node.setNodeValue(null);
   node = next;
  }
  header.setNextNode(null);header.setPreviousNode(null);
  header.setNodeValue(null);
  header = null;
  size = 0;
 }
 private LinkNode<T> getElement(int index) throws Exception{
  LinkNode<T> node = null;
  if(index < size && index > -1){
    node = header;
   for(int i = 1; i <= index;i++){
    node = node.getNextNode();
   }
   return node;
  }else{
   throw new Exception("超出索引");
  }
 }
}
package com.link;
public class LinkNode <T> {
 private LinkNode <T> previousNode= null;
 private LinkNode <T> nextNode = null;
 private T nodeValue = null;
 public LinkNode<T> getPreviousNode() {
  return previousNode;
 }
 public void setPreviousNode(LinkNode<T> previousNode) {
  this.previousNode = previousNode;
 }
 public LinkNode<T> getNextNode() {
  return nextNode;
 }
 public void setNextNode(LinkNode<T> nextNode) {
  this.nextNode = nextNode;
 }
 public T getNodeValue() {
  return nodeValue;
 }
 public void setNodeValue(T nodeValue) {
  this.nodeValue = nodeValue;
 }
 
}

测试
package com.link;

import java.util.TreeSet;

import com.baike.bean.UserInfo;

public class LinkListTest {
 public static void main(String[] args) throws Exception {
  Integer i =0;
  UserInfo u = new UserInfo();
  LinkedList _u = new LinkedList();
  _u.add(1);
  _u.add(2);
  _u.add(3);
  _u.add(4);
  _u.add(5);
  _u.add(6);
  _u.add(7);
 // _u.remove(6);
  System.out.println("--------------------list--------------------------");
  for(int j =0 ;j<_u.getSize();j++){
   System.out.println(_u.get(j).getNodeValue()   +"pre:"+_u.get(j).getPreviousNode().getNodeValue()+"next:"+_u.get(j).getNextNode().getNodeValue());
  }
  System.out.println("---------------------add-------------------------");
  _u.add(8, 6);
  System.out.println(_u.get(6).getNodeValue());
  System.out.println("--------------------list--------------------------");
  
  for(int j =0 ;j<_u.getSize();j++){
   System.out.println(_u.get(j).getNodeValue()   +"pre:"+_u.get(j).getPreviousNode().getNodeValue()+"next:"+_u.get(j).getNextNode().getNodeValue()); 
  }
  System.out.println("----------------------------------------------");
  java.util.LinkedList  inti = new java.util.LinkedList();
  inti.add(1);
  inti.add(2);
  inti.add(3);
  inti.add(3);
  inti.add(3);
  inti.add(1,4);
  Object o =3;
  inti.remove(o);
  System.out.println(inti.get(1));
  for(int j =0 ;j<inti.size();j++){
   System.out.println(inti.get(j));
  }
 }
}