数据结构之——循环双向链表的实现

所有考试都已经结束,是时候好好学习数据结构,前些日子学了数据结构的线性表和队列就开始准备期末考,现在要把剩下的内容好好补上。一些相对简单的内容就不在博客上记录,把一些复杂的,自己有思考的内容记录在博客上。

空双向链表

带头结点的双向链表

头结点看作是两个相同的节点,它的前驱节点是本身,后继节点也是本身,这样就实现了自循环。

这里写图片描述

插入

有了这样的思想,那么插入操作就很好理解了,我们在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();
     }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章