首先需要定义一个节点类:Node
/**
* 链表的数据载体:节点
* @author Administrator
*
*/
public class Node {
//保存的真正数据
public Object o;
//上一个节点的引用
public Node pre;
//下一个节点的引用
public Node next;
public Node(Object o) {
this.o = o;
this.pre = null;
this.next = null;
}
public Object getO() {
return o;
}
public void setO(Object o) {
this.o = o;
}
public Node getPre() {
return pre;
}
public void setPre(Node pre) {
this.pre = pre;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
//判断链表是否有下一个节点
public boolean hasNext(){
return this.getNext() != null;
}
}
2. 链表类
/**
* 双向链表:基本操作:
* 追加链表:void addNode(Node node);
* 插入节点:void insertNode(Node node);
* 删除链表:void delNode(Node node);
* 查询链表(boolean):boolean findNode(Node node);
* 定位链表:Node locationNode(int index);
* 遍历链表:void display(Node head);
* @version 1.0
* @author Administrator
*
*/
public class DoubleLink {
//存入的基本元素是链表
public Node node;
public DoubleLink(Node node){
this.node = node;
}
/**
* 追加链表:void addNode(Node node);
* @return
* @param Node node
*/
public void addNode(Node node){
//拿到头节点
Node head = this.node;
//找到尾部
while(head.hasNext()){
head = head.next;
}
//添加操作
node.pre = head;
node.next = head.next;
head.next = node;
}
/**
* 插入节点:void insertNode(Node node);
*/
public void insertNode(int i, Node node){
//定位i位置是否存在
Node p = this.locationNode(i);
//节点不存在
if(p == null){
System.out.println("添加失败:下标错误或者没有找到");
return;
}
//节点被找到
node.pre = p.pre;
node.next = p;
p.pre.next = node;
p.pre = node;
}
/**
* 删除链表:void delNode(Node node);
*/
public void delNode(Node node){
Node n = this.node;
if(findNode(node))
{
//node.next.pre=node.pre;
node.pre.next = node.next;
}else
{
System.out.println("节点没找到,无法删除");
return ;
}
}
/**
* 查询链表(boolean):boolean findNode(Node node);
*/
public boolean findNode(Node node){
Node head1=this.node;
while(head1.hasNext())
{
if(head1.next.equals(node))
{
System.out.println(node.o);
return true;
}
head1=head1.next;
}
return false;
}
/**
* 定位链表:Node locationNode(int index);
*/
public Node locationNode(int index){
int i = 0;
Node head = this.node;
//判断给定序号是否正确
if(index < 0 || index > this.len()){
System.out.println("给定的序号不合法");
return new Node("");
}
//遍历
while(head.hasNext()){
i++;
head = head.next;
if(i == index){
return head;
}
}
return null;
}
/**
* 遍历链表:void display(Node head);
*/
public void display(){
Node head = this.node;
while(head != null){
//System.out.println("插入成功");
System.out.println(head.o);
head = head.next;
}
}
/**
* 计算链表的长度:头节点为第0位
*/
public int len(){
Node head = this.node;
int len = 0;
while(head.hasNext()){
len++;
head = head.next;
}
return len;
}
}