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;
    }
    }
    }

  • 相关阅读:
    MVP on dot NET Episode 1
    以服务器端为中心的 ASP.NET AJAX 模式 (Part 2 Control)
    以服务器端为中心的 ASP.NET AJAX 模式 (Part 1 Behavior)
    编写 iPhone Friendly 的 Web 应用程序 (Part 6 iUI)
    Vista 为什么要引入 UAC
    Windows 就是一个带 UI 的命令行
    ASP.NET AJAX 4.0 Preview 3 (Part 2 ASP.NET AJAX Template)
    如何订阅MVP on dot NET(或其它播客) iTunes版
    深入理解 ASP.NET 动态控件 (Part 5 编译实验)
    使用 .NET 实现 Ajax 长连接 (Part 2 Mutex Wait & Signal)
  • 原文地址:https://www.cnblogs.com/handsome1013/p/5341396.html
Copyright © 2011-2022 走看看