zoukankan      html  css  js  c++  java
  • 双向链表的操作

    摘自:http://www.cnblogs.com/skywang12345/p/3561803.html

    一、双向链表

    双向链表是链表的一种。它的每一个结点都有两个指针,一个指向前一个结点,一个指向后一个结点。因此可以从双向链表的任意结点开始可以很方便的访问链表的任意位置。

    双向链表示意图

    1、双向链表的删除

    2、双向链表的插入

    二、Code

    在做删除插入的时候,最好把图画出来。这样思路就很清晰

     1 package algorithm;
     2 
     3 /**
     4  * Created by adrian.wu on 2019/2/26.
     5  */
     6 public class DLink<T> {
     7     private DNode<T> head;
     8 
     9     private int nodeCount;
    10 
    11     private class DNode<T> {
    12         DNode<T> preNode;
    13         DNode<T> next;
    14         T value;
    15 
    16         DNode(T value, DNode<T> pre, DNode<T> next) {
    17             this.value = value;
    18             this.preNode = pre;
    19             this.next = next;
    20         }
    21     }
    22 
    23     public DLink() {
    24         head = new DNode<>(null, null, null);
    25         head.preNode = head.next = head;
    26     }
    27 
    28 
    29     public int size() {
    30         return nodeCount;
    31     }
    32 
    33     public boolean isEmpty() {
    34         return nodeCount == 0;
    35     }
    36 
    37     @SuppressWarnings("unchecked")
    38     private DNode<T> getNode(int index) {
    39         if (index < 0 || index >= nodeCount) throw new IndexOutOfBoundsException();
    40 
    41         DNode<T> node = head;
    43 
    44         if (index <= nodeCount / 2)
    45             for (int i = 0; i < index; i++)
    46                 node = node.next;
    47         else
    48             for (int i = nodeCount - index; i > 0; i--)
    49                 node = node.preNode;
    50 
    51         return node;
    52     }
    53 
    54     //插入到index结点的前面
    55     public void insert(int index, T t) {
    56         DNode<T> node = getNode(index);
    57         DNode<T> insertNode = new DNode<>(t, node.preNode, node);
    58         node.preNode.next = insertNode;
    59         node.preNode = insertNode;
    60         if (index == 0) head = insertNode;
    61         nodeCount++;
    62     }
    63 
    64     //删除第index个结点
    65     public void delete(int index) {
    66         DNode<T> node = getNode(index);
    67         node.preNode.next = node.next;
    68         node.next.preNode = node.preNode;
    69         if (index == 0) head = node.next;
    70         nodeCount--;
    71     }
    72 }
    谢谢!
  • 相关阅读:
    1.1 HTML5简介
    MATLAB基础知识——1.1MATLAB系统变量
    初识MATLAB
    Z-Stack
    [C语言]关于struct和typedef struct
    [Zigbee]定时器1
    常用数论算法
    SPFA&邻接表 PASCAL
    kruskal算法-Pascal
    懒惰的JY--关于遍历
  • 原文地址:https://www.cnblogs.com/ylxn/p/10439823.html
Copyright © 2011-2022 走看看