两条循环双链表的连接JAVA_数据结构学习----线性表的链式表示之循环双链表(Java实现)...

packagecom.clarck.datastructure.dlinked;/*** 循环双链表

*

*@authorclarck

*

*@param*/

public class CirDoublyLinkedList implements LList{/*** 头节点*/

public DLinkNodehead;/*** 默认构造方法,构造空循环双链表

*

* 创建头结点,3个域值均为null*/

publicCirDoublyLinkedList() {this.head = new DLinkNode();this.head.pred = this.head;this.head.next = this.head;

}/*** 由指定数组中的多个对象构造循环双链表,采用尾插入构造循环双链表

*

*@paramelement*/

publicCirDoublyLinkedList(T[] element) {//创建空循环双链表,只有头结点

this();

DLinkNode rear = this.head;for (int i = 0; i < element.length; i++) {

rear.next= new DLinkNode(element[i], rear, this.head); //尾插入

rear =rear.next;

}this.head.pred =rear;

}/*** 深拷贝构造方法,复制循环双链表

*

*@paramlist*/

public CirDoublyLinkedList(CirDoublyLinkedListlist) {//创建空循环双链表,只有头结点

this();

DLinkNode rear = this.head;for (DLinkNode p = list.head.next; p != list.head; p =p.next) {

rear.next= new DLinkNode(p.data, rear, this.head);

rear=rear.next;

}this.head.pred =rear;

}/*** 判断循环双链表是否空*/@Overridepublic booleanisEmpty() {return this.head.next == this.head;

}/*** 插入第i(≥0)个元素值为x。若x==null,不插入。 若i<0,插入x作为第0个元素;若i大于表长,插入x作为最后一个元素。O(n)*/@Overridepublic intlength() {int i = 0;for (DLinkNode p = this.head.next; p != this.head; p =p.next) {

i++;

}returni;

}/*** 返回第i(≥0)个元素,若i<0或大于表长则返回null,*/@Overridepublic T get(inti) {if (i >= 0) {

DLinkNode p = this.head.next;for (int j = 0; p != this.head && j < i; j++) {

p=p.next;

}//p指向第i个结点

if (p != null) {returnp.data;

}

}return null;

}/*** 设置第i(≥0)个元素值为x。若i<0或大于表长则抛出序号越界异常;若x==null,不操作。O(n)*/@Overridepublic void set(inti, T x) {if (x == null)return;

DLinkNode p = this.head.next;for (int j = 0; p != this.head && j < i; j++) {

p=p.next;

}//p指向第i个结点

if (i >= 0 && p != null) {

p.data=x;

}else{throw new IndexOutOfBoundsException(i + "");

}

}/*** 插入第i(≥0)个元素值为x。若x==null,不插入。 若i<0,插入x作为第0个元素;若i大于表长,插入x作为最后一个元素。O(n)*/@Overridepublic void insert(inti, T x) {if (x == null)return;

DLinkNode p = this.head;//寻找插入位置 循环停止时,p指向第i-1个结点

for (int j = 0; p.next != this.head && j < i; j++) {

p=p.next;

}//插入在p结点之后,包括头插入、中间插入

DLinkNode q = new DLinkNode(x, p, p.next);

p.next.pred=q;

p.next=q;

}/*** 在循环双链表最后添加结点,O(1)*/@Overridepublic voidappend(T x) {if (x == null)return;//插入在头结点之前,相当于尾插入

DLinkNode q = new DLinkNode(x, head.pred, head);

head.pred.next=q;

head.pred=q;

}/*** 删除第i(≥0)个元素,返回被删除对象。若i<0或i大于表长,不删除,返回null。O(n)*/@Overridepublic T remove(inti) {if (i >= 0) {

DLinkNode p = this.head.next;//定位到待删除结点

for (int j = 0; p != this.head && j < i; j++) {

p=p.next;

}if (p !=head) {//获得原对象

T old =p.data;//删除p结点自己

p.pred.next =p.next;

p.next.pred=p.pred;returnold;

}

}return null;

}/*** 删除循环双链表所有元素*/@Overridepublic voidremoveAll() {this.head.pred = this.head;this.head.next = this.head;

}/*** 顺序查找关键字为key元素,返回首次出现的元素,若查找不成功返回null

* key可以只包含关键字数据项,由T类的equals()方法提供比较对象相等的依据*/@OverridepublicT search(T key) {if (key == null)return null;for (DLinkNode p = this.head.next; p != this.head; p =p.next)if(key.equals(p.data))returnp.data;return null;

}/*** 返回循环双链表所有元素的描述字符串,循环双链表遍历算法,O(n)*/@OverridepublicString toString() {

String str= "(";for (DLinkNode p = this.head.next; p != this.head; p =p.next) {

str+=p.data.toString();if (p.next != this.head)

str+= ",";

}return str + ")"; //空表返回()

}/*** 比较两条循环双链表是否相等,覆盖Object类的equals(obj)方法*/@SuppressWarnings("unchecked")public booleanequals(Object obj) {if (obj == this)return true;if (!(obj instanceofCirDoublyLinkedList))return false;

DLinkNode p = this.head.next;

CirDoublyLinkedList list = (CirDoublyLinkedList) obj;

DLinkNode q =list.head.next;while (p != head && q != list.head &&p.data.equals(q.data)) {

p=p.next;

q=q.next;

}return p == head && q ==list.head;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值