数据结构(三)---双向循环链表的实现---java版
節點設置
package com.cn.hbut.domain;
/**
?* @author Administrator
?* 雙向循環鏈表的節點設置
?*/
public class DNode {
//節點,前驅與后繼
DNode prior,next;
//數據
Object data;
public DNode(DNode prior, DNode next, Object data) {
this.prior = prior;
this.next = next;
this.data = data;
}
public DNode() {
this(null,null,null);
}
public DNode getPrior() {
return prior;
}
public void setPrior(DNode prior) {
this.prior = prior;
}
public DNode getNext() {
return next;
}
public void setNext(DNode next) {
this.next = next;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
@Override
public String toString() {
return "DNode [prior=" + prior + ", next=" + next + ", data=" + data
+ "]";
}
}
--------------------------------------------------------------------------------------------
具體的實現
package com.cn.hbut.daoImpl;
import com.cn.hbut.dao.DefineList;
import com.cn.hbut.domain.DNode;
public class DList implements DefineList{
DNode d1;
int size;
//創建一個雙向鏈表,數據為數組a里面的數據
public DList(Object []a) {
d1 = new DNode();
d1.setNext(d1);
d1.setPrior(d1);
for(int i=a.length-1;i>=0;i--){
DNode p=new DNode(d1,d1.getNext(),a[i]);
//記得把p的下一個節點的前驅設置為p
d1.getNext().setPrior(p);
d1.setNext(p);
}
size=a.length;
}
public DList(){
//創建一個雙向鏈表,數據域為null
size=0;
d1 = new DNode();
d1.setPrior(d1);
d1.setNext(d1);
}
//取雙向循環鏈表中的第i個節點
public DNode index(int i){
if(i<0||i>size){
return null;
}
//第0個節點并沒有設置值
if(i==0){
return d1;
}
//從第一個節點開始有數據
int index=1;
//第二個節點
DNode p = d1.getNext();
while((index<i)&&(p!=d1)){
p=p.getNext();
index++;
}
return p;
}
@Override
public void clear() {
d1 = new DNode();
d1.setNext(d1);
d1.setPrior(d1);
size=0;
}
//獲取第i個節點的對象
@Override
public Object gete(int i) {
if(i<0||i>size){
return null;
}
return index(i).getData();
}
@Override
public int length() {
return size;
}
//獲取某個元素的位置
@Override
public int loc(Object e) {
for(int i=0;i<size;i++){
if(gete(i).equals(e)){
return i;
}
}
return -1;
}
//在位置loc插入元素e
@Override
public boolean inset(int loc, Object e) {
if(loc<0||loc>size){
return false;
}
//需要插入的前一個節點
DNode p=index(loc);
//等待插入的節點
DNode node = new DNode(p, p.getNext(), e);
p.setNext(node);
p.getNext().setPrior(node);
size++;
return true;
}
@Override
public Object dele(int loc) {
if(loc<0||loc>size){
return null;
}
//刪除節點的前一個節點
DNode p=index(loc-1);
//需要刪除的節點
DNode q=index(loc);
p.setNext(q.getNext());
q.getNext().setPrior(p);
size--;
return q.getData();
}
//判斷是否已滿
@Override
public boolean full() {
return false;
}
//判斷是否為空
@Override
public boolean empty() {
return d1.getNext()==d1;
}
public DNode getD1() {
return d1;
}
public void setD1(DNode d1) {
this.d1 = d1;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
//程序主入口,測試雙向循環鏈表
public static void main(String[] args) {
System.out.println("run...");
//創建一個對象數組
Object [] a = {1,3,5};
//創建一個雙向循環鏈表,初始化n個節點
DList dlist = new DList(a);
//取第一個節點
DNode node=dlist.index(1);
//打印第一個節點的值
System.out.println("獲取的第1個節點的值:"+node.getData());
//在第i個節點插入一個節點后為,1,6,3,5
dlist.inset(1, 6);
System.out.println("獲取的第2個節點的值:"+dlist.gete(2));
System.out.println("雙向鏈表的大小:"+dlist.size);
System.out.println("刪除的節點:"+dlist.dele(2));
System.out.println("獲取的第2個節點的值:"+dlist.gete(2));
System.out.println("雙向鏈表的大小:"+dlist.size);
System.out.println("over...");
}
}
總結
以上是生活随笔為你收集整理的数据结构(三)---双向循环链表的实现---java版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构(二)---单链表的实现---j
- 下一篇: 数据结构(四)---栈的顺序存储的实现-