/**
* 双向链表
*/
public class BothWayLink {
//定义一个首元结点
private Node head;
//定义一个size表示链表中结点的个数
private int size;
//获取链表的长度
public int getSize() {
return size;
}
//向链表的第i个位置插入一个节点
public void insert(int i, Object e) {
Node newNode = new Node(e, null, null);
if (i < 0 || i > size) {
throw new IndexOutOfBoundsException("下标越界");
}
if (head == null) {
//表示头节点为空,则将新节点作为头节点
head = newNode;
}
if (i == 0) {
//表示在头节点前插入
newNode.next = head;
head.pre = newNode;
} else {
Node pNode = head;
for (int j = 0; j < i; j++) {
pNode = pNode;
}
//执行到这里,pNode是链表中的第i个元素
//我们选择在pNode后面插入新的元素
pNode.next.pre = newNode;
newNode.next = pNode.next;
pNode.next = newNode;
newNode.pre = pNode;
}
size++;
}
//获取第一个数据域为e的节点的下标
public int getIndex(Object e){
Node pNode = head;
for (int i = 0; i < size; i++) {
if (e==null && pNode.data== null){
return i;
} if (e!=null && pNode.data.equals(e)){
return i;
}
}
return -1;
}
//判断链表是否为空
public boolean isEmpty(){
if (size > 0) {
return false;
}
return true;
}
//判断链表是否包含某个元素
public boolean isContains(Object e){
if (getIndex(e) != -1){
return true;
}
return false;
}
//移除下标是i的节点
public Object delete(int i){
Node pNode = head;
if (i<0 || i>size){
throw new IndexOutOfBoundsException("下标越界");
}
//移除头节点
if (i == 0){
head = head.next;
head.next.pre = null;
}
for (int j = 0; j < i; j++) {
pNode.next = pNode;
}
Object old = pNode.data;
pNode.pre.next = pNode.next;
pNode.next.pre = pNode.pre;
size--;
return old;
}
//移除第一个数据域是e的节点
public void delete(Object e){
int index = getIndex(e);
delete(index);
}
//获取下标是i的节点
public Node getNode(int i){
Node pNode = head;
if (i<0 || i>size){
throw new IndexOutOfBoundsException("下标越界");
}
if (i == 0){
return head;
}
for (int j = 0; j < i; j++) {
pNode = pNode.next;
}
return pNode;
}
//修改(替换)下标为i的结点的data
private Object update(int i, Object e){
Node pNode = getNode(i);
Object old = pNode.data;
pNode.data = e;
return old;
}
//重写toString方法
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("[");
Node pNode = head;
while (pNode != null){
builder.append(pNode.data);
if (pNode.next != null){
builder.append(",");
}
}
builder.append("]");
return builder.toString();
}
//定义一个内部类来模拟双向链表
private class Node {
Object data;
Node pre;
Node next;
public Node(Object data, Node pre, Node next) {
this.data = data;
this.pre = pre;
this.next = next;
}
}
}
数据结构之链表--双向链表
最新推荐文章于 2024-11-04 13:52:23 发布