zoukankan      html  css  js  c++  java
  • 链表List

    当要创建一个链表的时候,首先要创建一个节点类,在Java里面叫条目(entry表示),这个类是一个嵌套类,里面包含三个要素,element, next, previous。

    public class Link<E> {

    private static class Entry<E> {
    private E element;

    private Entry<E> next;

    private Entry<E> previous;


    public Entry(E e, Entry<E> next , Entry<E> previous) {
    this.element = e;
    this.next = next;
    this.previous = previous;
    }
    }
    }

    创建一个头结点和初始头结点,另外增加一个size用来统计节点数

    public class Link<E> {

    private transient Entry<E> header = new Entry<E>(null, null, null);
    private transient int size = 0;

    /**
    * Constructs an empty list.
    */
    public Link() {
    header.next = header.previous = header;
    }

    private static class Entry<E> {
    private E element;

    private Entry<E> next;

    private Entry<E> previous;


    public Entry(E e, Entry<E> next , Entry<E> previous) {
    this.element = e;
    this.next = next;
    this.previous = previous;
    }
    }
    }

    添加和获取、删除节点

    package com.hyd.link;

    import java.util.NoSuchElementException;

    public class Link<E> {

    private transient Entry<E> header = new Entry<E>(null, null, null);
    private transient int size = 0;

    /**
    * Constructs an empty list.
    */
    public Link() {
    header.next = header.previous = header;
    }

    public int size() {
    return this.size;
    }

    public boolean add(E e) {
    addBefore(e, header);
    return true;
    }

    public E get(int index) {
    return entry(index).element;
    }

    public E remove(int index) {
    return remove(entry(index));
    }

    private Entry<E> addBefore(E e, Entry<E> entry) {
    Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
    newEntry.previous.next = newEntry;
    newEntry.next.previous = newEntry;
    size ++;
    return newEntry;
    }

    /**
    * Returns the indexed entry.
    */
    private Entry<E> entry(int index) {
    if (index < 0 || index > size) {
    throw new IndexOutOfBoundsException("Index: " + index +
    ", Size: " + size);
    }

    Entry<E> e = header;
    if (index < (size >> 1)) {
    for (int i = 0; i <= index; i++)
    e = e.next;
    } else {
    for (int i = size; i > index; i--)
    e = e.previous;
    }


    return e;
    }

    private E remove(Entry<E> e) {
    if (e == header)
    throw new NoSuchElementException();

    E result = e.element;
    e.previous.next = e.next;
    e.next.previous = e.previous;
    e.next = e.previous = null;
    e.element = null;
    size--;
    return result;
    }

    private static class Entry<E> {
    private E element;

    private Entry<E> next;

    private Entry<E> previous;


    public Entry(E e, Entry<E> next , Entry<E> previous) {
    this.element = e;
    this.next = next;
    this.previous = previous;
    }
    }
    }

  • 相关阅读:
    C++基础知识篇:C++ 存储类
    听说高手都用记事本写C语言代码?那你知道怎么编译运行吗?
    培训机构出来的程序员和科班比?看看这个科班毕业生怎么说~
    C++基础知识篇:C++ 修饰符类型
    从大学毕业到就业,程序员的人生如何走过?30岁以后的开发人员路在何方?
    终于有人把鸿蒙OS讲明白了,大佬讲解!快收藏!
    C++基础知识篇:C++ 常量
    Portrait Matting
    Deep-Trimap-Generation-for-Automatic-Video-Matting-using-GAN
    Automatic Trimap Generator
  • 原文地址:https://www.cnblogs.com/handsome1013/p/5341396.html
Copyright © 2011-2022 走看看