zoukankan      html  css  js  c++  java
  • 使用嵌套类DoubleNode实现双向链表

    每一个节点都含有指向前驱节点的引用pre

    每一个节点都含有指向后继节点的引用next

    实现以下功能:

    1.在表头插入节点
    2.在表尾插入节点
    3.从表头删除节点
    4.从表尾删除节点
    5.从指定节点之前插入新节点
    6.从指定节点之后插入新节点
    7.删除指定节点
    8.输出链表

    代码

    /**
    * @author 鯉伴MAY
    * @param <Item> 泛型
    */
    public class TwoDirLinkedList <Item> {
       private class DoubleNode {
           Item item;
           DoubleNode pre;
           DoubleNode next;
       }
       private DoubleNode first;//指向首节点
       private DoubleNode last;//指向尾结点
       private int N;
    
       //判断链表是否为空
       public boolean isEmpty() {
           return this.first == null;
       }
    
       public int size() {
           return this.N;
       }
    
       public  void insertAtFirst(Item item) {
           DoubleNode newNode = new DoubleNode();
           newNode.item = item;
           //处理空链表
           if(isEmpty()) {
               this.first = newNode;
               this.last = newNode;
           }else {
               newNode.next = this.first;
               first.pre = newNode;
               first = newNode;
           }
           N++;
       }
    
       public void insertAtLast(Item item) {
           DoubleNode newNode = new DoubleNode();
           newNode.item = item;
           //处理空链表
           if(isEmpty()) {
               this.first = newNode;
               this.last = newNode;
           }else {
               last.next = newNode;
               newNode.pre = last;
               last = newNode;
           }
           N++;
       }
    
       public DoubleNode deleteAtFirst(){
           if(first == null) {
               System.out.println("链表已空");
               return null;
           }
           DoubleNode temp;
           temp = first;
           //处理只有一个节点的情况
           if(size() == 1) {
               first = null;
               last = null;
           }else {
               this.first = this.first.next;
               this.first.pre = null;
           }
           N--;
           return temp;
       }
    
       public DoubleNode deleteAtLast() {
           if(last == null) {
               System.out.println("链表已空");
               return null;
           }
           DoubleNode temp;
           temp = this.last;
           if(size() == 1) {
               first = null;
               last = null;
           }else {
               this.last = this.last.pre;
               this.last.next = null;
           }
           N--;
           return temp;
       }
    
       /**
        *
        * @param item
        * @return 返回指向查找节点的指针,如果没有,则返回空
        */
       private DoubleNode findNode(Item item) {
           DoubleNode temp = this.first;
           while(temp != null) {
               if(temp.item.equals(item)){
                   return temp;
               }
               temp = temp.next;
           }
           return null;
       }
    
       public boolean insertAtBefore(Item oldItem,Item newItem) {
           DoubleNode temp = findNode(oldItem);
           //处理几种特殊情况
           if(temp == null) {
               System.out.println("链表中没有指定节点");
               return false;
           } else if(temp.item.equals(first.item)) {
               insertAtFirst(newItem);
               return true;
           }
           DoubleNode newNode = new DoubleNode();
           newNode.item = newItem;
           newNode.next = temp;
           temp.pre.next = newNode;
           newNode.pre = temp.pre;
           temp.pre = newNode;
           N++;
           return true;
       }
    
       public boolean insertAtBehind(Item oldItem,Item newItem) {
           DoubleNode temp = findNode(oldItem);
           //处理特殊情况
           if(temp == null) {
               System.out.println("链表中没有此节点");
               return false;
           } else if(temp.item.equals(last.item)) {
               insertAtLast(newItem);
               return true;
           }
           DoubleNode newNode = new DoubleNode();
           newNode.item = newItem;
           newNode.next = temp.next;
           temp.next.pre = newNode;
           newNode.pre = temp;
           temp.next = newNode;
           N++;
           return true;
       }
       public boolean deleteAt(Item item){
           DoubleNode temp = findNode(item);
           //处理特殊情况
           if(temp == null) {
               System.out.println("链表中没有此节点");
               return false;
           }else if(temp.item.equals(first.item)) {
               deleteAtFirst();
               return true;
           }else if(temp.item.equals(last.item)) {
               deleteAtLast();
               return true;
           }
           temp.next.pre = temp.pre;
           temp.pre.next = temp.next;
           temp.pre = null;
           temp.next = null;
           N--;
           return true;
       }
    
       public void printList() {
           DoubleNode temp = first;
           while(temp != null) {
               System.out.println(temp.item);
               temp = temp.next;
           }
       }
    }
    
    

    如果需要变为静态方法,则需要改变方法的传入参数,将链表的头结点传入

  • 相关阅读:
    求欧拉回路的算法学习
    2020牛客暑期多校训练营(第六场 )C Combination of Physics and Maths(思维)
    2020牛客暑期多校训练营(第六场)E.Easy Construction(思维构造,附图解)
    CF1038D Slime(思维+枚举+贪心)(来自洛谷)
    CF1250B The Feast and the Bus(贪心+枚举)(来自洛谷)
    Codeforces Round #659 (Div. 2) A.Common Prefixes
    IDEA本人亲测可用的破解方法
    Codeforces Round #658 (Div. 2)(A,B博弈,C1,C2)
    2020牛客暑期多校训练营(第四场)B.Basic Gcd Problem(数学)
    2020牛客暑期多校训练营(第三场)B.Classical String Problem(思维)
  • 原文地址:https://www.cnblogs.com/dwwzone/p/12859255.html
Copyright © 2011-2022 走看看