package boluo;
public class Test2 {
public static void main(String[] args) {
LinkedList link = new LinkedList();
link.add("123456");
link.add("456789");
link.add("boluo");
link.add("chuixue");
link.delete(3);
System.out.println(link);
}
}
//双链表,由节点组成,节点用内部类来表示
class LinkedList {
int size = 0; //节点个数
Node first; //头节点
Node last; //尾节点
static class Node { //里面分三部分,数据,存储上一个节点的数据,存储下一个节点的数据
String data;
Node prev;
Node next;
public Node(String data, Node prev, Node next) {
this.data = data;
this.prev = prev;
this.next = next;
}
}
// 到此链表的组成元素就声明完成,接下来把这些组件连接到一块
// 下标越界问题
public void isout(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("Index" + index);
}
}
// 添加元素, 传入的是数据data, 如果链表中没有节点,就作为头节点,否则的话就添加到最后边
public void add(String str) {
// 新建的节点作为新传入的数据
Node node = new Node(str, null, null);
if (size == 0) { //节点个数为0,就要把这个数据当作头节点
this.first = node;
this.last = node;
} else { //里面原本有节点的话,就要放到末尾
this.last.next = node;
node.prev = this.last; //这时候this.last还是老的尾节点,所以把它放到新的为节点的prev中
this.last = node; //这时候才真正把尾节点设置为新添加进来的节点
}
size++;
}
// 根据下标找到指定的节点
public Node getNode(int index) {
//相当于复制了一个头节点,然后遍历到index位置,把index处的节点取出来
Node no = this.first; //复制头节点,不会影响原来的链
for (int i = 0; i < index; i++) {
no = no.next;
}
return no;
}
// 插入元素
public void insert(int index, String data) {
isout(index); //判断下标是否越界
// 新建节点来接收传入的新数据
Node node = new Node(data, null, null);
if (index == 0) { //插入到头节点前面的位置
this.first.prev = node;
node.next = this.first; //此时this.first还是老的头节点
this.first = node; //这时候才把头节点正式改为新的传进来的节点
} else if (index == size) { //插入到尾节点的后面
this.last.next = node;
node.prev = this.last;
this.last = node;
} else { //插入到中间的位置
//要先找到插入到他前面的那个节点
Node no = getNode(index); //新节点要插入到no的前面
no.prev.next = node;
node.prev = no.prev;
node.next = no;
no.prev = node;
}
size++;
}
// 根据下标进行删除
public void delete(int index) {
isout(index);
if (index == 0) { //删除头节点
this.first.next.prev = null; //先让第二个节点的prev指为null
this.first = this.first.next;
} else if (index == size - 1) { //删除尾节点
this.last.prev.next = null;
this.last = this.last.prev;
} else { //删除中间的节点
//先找到要删除的元素的下标
Node no = getNode(index);
no.next.prev = no.prev;
no.prev.next = no.next;
}
size--;
}
public String toString() {
//遍历节点, 依次拼接真实值
StringBuilder sb = new StringBuilder("[");
Node no = this.first;
for (int i = 0; i < size; i++) {
sb.append(no.data).append(", ");
no = no.next;
}
// 转换字符串
String str = sb.toString();
// 判断size是否为0
if (size > 0)
str = str.substring(0, str.length() - 2);
// 返回
return str + "]";
}
}
双链表的实现
于 2019-09-26 23:48:15 首次发布