JAVA循环双链表的建立
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JAVA循环双链表的建立
import java.util.Scanner;
//循环双向链表的结点类
class DuLNode {
private Object data;// 存放结点值
private DuLNode prior; // 前驱结点的引用
private DuLNode next; // 后继结点的引用
public DuLNode() {// 无参数时的构造函数
this(null);
}
public DuLNode(Object data) {// 构造值为data 的结点this.data = data;
this.prior = null;
this.next = null;
}
public Object getData() {
return data;
}
public DuLNode getNext() {
return next;
}
public DuLNode getPrior() {
return prior;
}
public void setData(Object data) {
this.data = data;
}
public void setNext(DuLNode next) {
this.next = next;
}
public void setPrior(DuLNode prior) {
this.prior = prior;
}
}
//双向链表类
public class DuLinkList{
private DuLNode head;// 双向循环链表的头结点// 双向链表的构造函数
public DuLinkList() {
head = new DuLNode(); // 初始化头结点
head.setPrior(head);// 初始化头结点的前驱和后继
head.setNext(head);
}
// 从表尾到表头逆向建立双向链表的算法。其中n 为该双向链表的元素个数
public DuLinkList(int n) throws Exception {
this();
Scanner sc = new Scanner(System.in);// 构造用于输入的对象
for (int j = 0; j < n; j++)
insert(0, sc.next());// 生成新结点,插入到表头
}
/*在双向循环链表的第i 个数据元素之前插入一个值为x 的数据元素,i 等于表长时,p指向头结点;i 大于表长时,p=NULL。
其中i 取值范围为:0?i?length()。当i=0 时表示在表头插入一个数据元素x,当i=length()时表示在表尾插入一个数据元素x*/
public void insert(int i, Object x) throws Exception {
DuLNode p = head.getNext();// 初始化,p 指向首结点,j 为计数器
int j = 0;
while (!p.equals(head) && j < i) {// 寻找插入位置i
p = p.getNext();// 指向后继结点
++j;// 计数器的值增1
}
if (j != i && !p.equals(head)) // i 小于0 或者大于表长
throw new Exception("插入位置不合理");// 输出异常DuLNode s = new DuLNode(x);// 生成新结点
s.setPrior(p.getPrior());
p.getPrior().setNext(s);
s.setNext(p);
p.setPrior(s);
}
//将双向循环链表中第i 个数据元素删除。其中i 取值范围为:0?i?ength()-1
public void remove(int i) throws Exception {
DuLNode p = head.getNext();// 初始化,p 指向首节点结点,j 为计数器
int j = 0;
while (!p.equals(head) && j < i) {// 寻找删除位置i
p = p.getNext();// 指向后继结点
++j;// 计数器的值增1
}
if (j != i) // i 小于0 或者大于表长减1
throw new Exception("删除位置不合理");// 输出异常
p.getPrior().setNext(p.getNext());
p.getNext().setPrior(p.getPrior());
}
//将一个已经存在的双向循环链表置成空
表
public void clear() {
head.setPrior(head);
head.setNext(head);
}
//判断当前双向循环链表是否为空
public boolean isEmpty() {
return head.equals(head.getNext());
}
//读取双向循环链表中的第i 个数据元素
public Object get(int i) throws Exception {
DuLNode p = head.getNext();// 初始化,p 指向首结点,j 为计数器
int j = 0;
while (!p.equals(head) && j < i) {// 从首结点向后查找,直到p 指向第i 个元素或p指向头结点
p = p.getNext();// 指向后继结点
++j;// 计数器的值增1
}
if (j > i || p.equals(head)) { // i 小于0 或者大于表长减1