所有考试都已经结束,是时候好好学习数据结构,前些日子学了数据结构的线性表和队列就开始准备期末考,现在要把剩下的内容好好补上。一些相对简单的内容就不在博客上记录,把一些复杂的,自己有思考的内容记录在博客上。
空双向链表
带头结点的双向链表
头结点看作是两个相同的节点,它的前驱节点是本身,后继节点也是本身,这样就实现了自循环。
插入
有了这样的思想,那么插入操作就很好理解了,我们在p处插入节点,p节点的前指针指向的节点的下一个就是s,s的前驱节点就是p的前驱节点,s的后继节点就是p,此时p的前驱节点变为了s,注意步骤的顺序
// 插入数据
public void insert(Object element,int i) {
Node pNode = head.next; //让pNode为头结点的下一个
int j=0;
while (j<i&&!pNode.equals(head)) {//寻找要插入的位置
pNode = pNode.next;
j++;
}
if (j!=i) {//j<i或者i<0
throw new IndexOutOfBoundsException("插入位置不合法");
}
Node sNode = new Node(element);
pNode.prior.next = sNode;
sNode.prior = pNode.prior;
sNode.next = pNode;
pNode.prior = sNode;
}
删除
同插入类似的思想,删除算法只需要改变删除节点前驱节点和后继节点的指针指向就好了
public void remove(int i){
Node pNode = head.next;
int j = 0;
while(j<i&&!pNode.equals(head)){
pNode = pNode.next;
j++;
}
if (j!=i) {
throw new IndexOutOfBoundsException("删除的位置错误");
}
pNode.prior.next = pNode.next;
pNode.next.prior = pNode.prior;
}
完整代码:
//带头结点的双向链表
class Node {
Object data;
Node next;
Node prior;
public Node(){
}
public Node(Object data){
this.data = data;
}
}
public class DuLinkList {
// 头结点
private Node head;
// 无参数构造函数,初始化头结点
public DuLinkList() {
head = new Node();
head.prior = head;
head.next = head;
}
// 插入数据
public void insert(Object element,int i) {
Node pNode = head.next; //让pNode为头结点的下一个
int j=0;
while (j<i&&!pNode.equals(head)) {//寻找要插入的位置
pNode = pNode.next;
j++;
}
if (j!=i) {//j<i或者i<0
throw new IndexOutOfBoundsException("插入位置不合法");
}
Node sNode = new Node(element);
pNode.prior.next = sNode;
sNode.prior = pNode.prior;
sNode.next = pNode;
pNode.prior = sNode;
}
public void remove(int i){
Node pNode = head.next;
int j = 0;
while(j<i&&!pNode.equals(head)){
pNode = pNode.next;
j++;
}
if (j!=i) {
throw new IndexOutOfBoundsException("删除的位置错误");
}
pNode.prior.next = pNode.next;
pNode.next.prior = pNode.prior;
}
public void display(){
Node pNode = head.next;
while(!pNode.equals(head)){
System.out.print(pNode.data+" ");
pNode = pNode.next;
}
System.out.println();
}
public static void main(String[] args) {
DuLinkList linkList = new DuLinkList();
linkList.insert("AA", 0);
linkList.insert("BB", 1);
linkList.insert("CC", 2);
linkList.display();
linkList.remove(1);
linkList.display();
}
}