链表之双向链表

首先在说下单链表,才能和双链表作比较

单链表(单向链表):由两部分组成 数据域(Data)和结点域(Node),单链表就像是一条打了很多结的绳子,每一个绳结相当于一个结点,每个节结点间都有绳子连接,这样原理的实现是通过Node结点区的头指针head实现的,每个结点都有一个指针,每个节点指针的指向都是指向自身结点的下一个结点,最后一个结点的head指向为null,这样一来就连成了上述所说绳子一样的链,对单链表的操作只能从一端开始,如果需要查找链表中的某一个结点,则需要从头开始进行遍历。

 

添加:上图可以看出 单向链表只有一个指向,原来head为p,p指向s,添加结点只需要把p指向q,q指向s就可以了,即:p--->q ;  q--->s ; 这样就实现了单向链表的添加

删除:原理与添加相反,若此时链表为 p---> q --->s ; 若删除q节点只需要更改p的指向就可以了 p--->s,这样就删掉了;

  查找:查找操作需要对整个但链表进行遍历,直到满足查找条件为止;

 

双向链表:

双链表(双向链表):双链表和单链表相比,多了一个指向尾指针(tail),双链表的每个结点都有一个头指针head和尾指针tail,双链表相比单链表更容易操作,双链表结点的首结点的head指向为null,tail指向下一个节点的tail;尾结点的head指向前一个结点的head,tail 指向为null,是双向的关系;

代码:public class LinKList{

       Node head;

       Node tail;

       int count;

              public LinkList(Node node,Node tail,int count){

                   this.head = null;

                   this.tail = null;

                  this.count = 0;

              }

            public LinkList(){ 

            }

           //头插法添加节点

          public vois addHeadNode(NodeData data){

              Node node = new Node(data,null,null);

                     if(head == null && tail ==null){

                              head = node;

                             head.setFront(null);

                            tail = node;

                            tail.setNext(null);

                          }else{

                          head.setFront(node);

                          node.setNext(head)

                          head = node;

                           head.setFront(null);

                               }

 

              }

//尾插法添加节点

public void addTailNode(NodeData data){  

       Node node = new Node(data,null,null);  

       if(head==null&&tail==null){  

            head=node;  

            head.setFront(null);  

            tail=node;  

            tail.setNext(null);  

        }else{  

            tail.setNext(node);  

            node.setFront(tail);  

            tail=node;  

            tail.setNext(null);  

        }  

        count++; 

}

//查找节点

public Node findNode(NodeData data){

    Node temp =head;

     if(head != null ){

        while (temp != null ){

            if(temp.data.compare(data)){

                  return temp;

           }

          temp =temp.getNext();

      }

   }

return null ;

 }

//删除节点

public void delNode(NodeData data){

         Node temp =findNode(data);

         if(temp != null){

           if(temp.getFront() ==null){

               head = temp.getNext();

              head.setFront(null);               

               }else if(temp.getNext()==null){

                     //说明是尾结点

                     tail= temp.getFront();

                     tail.setNext(null);

                  }else{

                           temp.getFront().setNext(temp.getNext());

                            temp.getNext().setFront(temp.getFront())

                     }

             }

      }

}

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值