双向链表的设计(1)

空扰寡人 提交于 2019-12-10 12:32:16

双向链表节点的定义

public class doubleListNode {
 int val;             //数据项
 doubleListNode prev; //定义前向指针,指向节点的前一个节点
 doubleListNode next; //定义后向指针,指向节点的后一个节点
 public doubleListNode(int x){ 
  val=x;
 }                    //构造器,使之能够将输入的int型数字变成一个节点型数字
}

双向链表的一些功能

初始化链表

/**初始化链表**/
    private doubleListNode head;
    private doubleListNode last;
    public MyDoubleLink() {
          head=null;
          last=null;
    }

在头结点添加链表元素

/* 在头结点添加元素 */
    public void addAtHead(int val) {
     doubleListNode cur=new doubleListNode(val);
     if(isEmpty()) {//判断链表是否为空
      last=cur;
     }//如果是空链表,则last字段需要特殊处理
     else {
      head.prev=cur;  //cur<-- old head
     } 
         cur.next=head;  //cur-->old head
      head=cur;         
    }
 /* 判断是否是空链表 */
    public boolean isEmpty() {
     return (head==null);
    }

在尾节点添加元素

/* 在尾节点添加元素 */
    public void addAtTail(int val) {
     doubleListNode cur=new doubleListNode(val);
     if(isEmpty()) {
      head=cur;     //头结点需要单独处理
     }else {
      last.next=cur;   //old last-->cur
     }
     cur.prev=last;       //old last<--cur
     last=cur;            
    }

在链表中间添加元素

假设:原始链表:1—>2
则: addAtIndex(-1,0): 0—>1—>2
addAtIndex(4,0): 0—>1—>2—>3
addAtIndex(2,0): 0—>1—>0—>2—>3

/* 在索引index之前添加节点 
  * 1、如果index<0,则在头结点之前添加
  * 2、如果index>链表长度,则在链表末尾添加
  * 3、如果1<index<=链表长度,则在索引之前添加元素
  * */
    public void addAtIndex(int index,int val) {
     int j=getNumber();
     if(index<0||index==0) {  //满足条件1,在链表头部添加元素
      addAtHead(val);
     }else if(index>j-1) {    //满足条件2,在链表尾部添加元素
      addAtTail(val);
     }else {                 //条件3
      doubleListNode p=head;
      doubleListNode cur=new doubleListNode(val);
      for(int i=0;i<index-1;i++) {
       p=p.next;
      }
      cur.next=p.next;
      p.next.prev=cur;
      cur.prev=p;
      p.next=cur;
     }
    }

删除链表中的元素

deleteIndex(index):
当索引值index不是有效值时,则不进行删除。解决办法:直接return返回

/* 删除索引index对应的节点
  * (只有index有效的时候才进行删除)
  * 解决办法:当index无效的时候,直接返回
  *  */
    public void deleteAtIndex(int index) {
     int j=getNumber();
     if(index<0||index>j-1) {//index无效时
      return;           
     }else if(index==0){     //删除头节点时
      head=head.next;
     }else if(index==j-1) {  //删除尾节点时
      last.prev.next=last.next; // 尾节点之前的一个节点的next字段需要改变
      last=last.prev;          //尾节点需要改变
    }
     else {
      doubleListNode p=head;
      for(int i=0;i<index;i++) {
      p=p.next; 
      }
      p.prev.next=p.next;
      p.next.prev=p.prev;
     }
     showLinkedList();
    }

获取索引值index对应的链结点的值

当index超出链表范围时,返回-1

/* 返回索引index对应的元素值 */
    public int get(int index) {
     int j=getNumber();    //获取链表长度
     if(index<0||index>j-1) {
      return -1;
     }
     else {
      doubleListNode p=head;
      for(int i=0;i<index;i++) {
       p=p.next;
      }
           int b=p.val;
           return b;
     }
    }

获取链表的长度

/* 获取链表长度 */
    public int getNumber() {
     doubleListNode p=head;
     int i=1;
     //遍历链表
     while(p!=null&&p.next!=null) {
      p=p.next;
      i++;
     }
     int a=i;
     return a;
    }

将链表中的元素输出

/* 展示链表 */
    public void showLinkedList() {
     doubleListNode p=head;
     System.out.print("first->last:");
     while(p!=null) {
      System.out.print(p.val+"");
      p=p.next;
     }
    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!