JAVA循环双链表的建立

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档