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

  • 相关阅读:
    hdu4277 暴力
    hdu4271 Find Black Hand 2012长春网络赛E题 最短编辑距离
    poj3356 字符串的最小编辑距离 dp
    HDU4267 A Simple Problem with Integers 线段树/树状数组
    树链剖分 模版
    SPOJ375 Query on a tree 树链剖分
    Orz_panda cup I题 (xdoj1117) 状压dp
    27号的十道离线线段树
    The 2015 "Orz Panda" Cup Programming Contest
    codeforces #274 C. Riding in a Lift dp+前缀和优化
  • 原文地址:https://www.cnblogs.com/handsome1013/p/5341396.html
Copyright © 2011-2022 走看看