链表详解——Java版

什么是链表?

       链表是一个线性结构,但是存储的数据可以是非线性的。链表由一个个子节点构成,每个节点有两个部分:数据域和指针域,数据域就是实际存储数据的,指针域可以有一个和两个,单链表就是单个指针域指向后一个节点,双链表就是节点有两个指针域,分别指向前一个和后一个节点。

链表的核心:

  链表的核心就是指针域,通过对指针域的操作实现增加节点删除节点,所谓链表就是形象的表示出一环扣一环,这是链表的优点也是缺点,优点是:插入删除不需要移动所有节点,只需要将待插入的节点的指针域一个指向待插入位置的后一个节点,一个指向前一个节点;缺点就是搜索的时候必须遍历节点。

Java实现链表基本操作

//一个节点
class Node<E> {
    public Node next;
    public Node prev;
    public E item;
    public Node(E data) {
        this.item = data;
        next = null;
        prev = null;
    }
}

public class MyLinkedList<E> {
    private Node<E> head; //表头
    private Node<E> tail; //表尾
    private int size;  //表长
    public MyLinkedList() {
        size = 0;
        head = null;
        tail = null;
    }
    public int size() {
        return this.size;
    }
    public void add(E o) {   //将o增加到链表尾部
        Node tempNode = new Node(o);
        if(size == 0){  //节点为空节点的时候
            head = tempNode;
            tail =tempNode;
        }else {
            tail.next = tempNode;
            tempNode.prev = tail;
            tail = tempNode;
        }
        size++;
    }
    public E remove() { //从头移除元素
        return removeFirst();
    }

    public void showList(){
        Node<E> tempNode = head;
        while(tempNode != null){
            System.out.println(tempNode.item + " ");
            tempNode = tempNode.next;
        }
    }
    public void showListRevise(){
        Node<E> tempNode = tail;
        while(tempNode != null){
            System.out.println(tempNode.item + " ");
            tempNode = tempNode.prev;
        }
    }
    public E remove(int index) {  //删除指定位置的元素
        Node<E> tempNode;
        Node<E> resultNode;
        if(index<0 || index>size){
            return null;
        }else {
            if (index < (size >> 1)) {
                tempNode = head;
                for(int i=0;i<index;i++)
                    tempNode = tempNode.next;
                Node<E> par = tempNode.prev;
                Node<E> ch = tempNode.next;
                tempNode.prev.next = tempNode.next;
                tempNode.next.prev = tempNode.prev;
                resultNode = tempNode;
            } else {
                tempNode = tail;
                for(int i=size-1;index<i;i--)
                    tempNode = tempNode.prev;
                resultNode = tempNode;
                tempNode = tempNode.prev;
            }
            size--;
            return resultNode.item;
        }
    }
    public boolean remove(Object o) {
        return removeFirstOccurrence(0);
    }
    public E removeFirst() {
        Node<E> tempNode;
        if(size>0){
            tempNode = head;
            head = head.next;
            head.prev = null;
            size--;
            return tempNode.item;
        }else
            return null;
    }
    public E removeLast() {
        E temp = tail.item;
        tail = tail.prev;
        tail.next = null;
        size--;
        return temp;
    }

    public boolean removeFirstOccurrence(Object o){  //删除此列表中指定元素的第一个出现(从头到尾遍历列表时)。
        int tempSize = size;
        Node<E> tempNode = head;
        for(int i=0;i<tempSize;i++){
            if(tempNode.item.equals(o)){
                tempNode.prev = tempNode.next;
                tempNode.next = tempNode.prev;
                size--;
                return true;
            }
        }
        return false;
    }
    public void addFirst(E o) {  //将o插入链表开头
        Node tempNode = new Node(o);
        if(size==0){
            head = tempNode;
            tail = tempNode;
        }else {
            tempNode.next = head;
            tempNode.prev = null;  //前一个节点是空
            head = tempNode;
        }
        size++;
    }
    public void addLast(E o) {  //将o增加到链表尾部
        Node tempNode = new Node(o);
        if(size==0){
            head = tempNode;
            tail = tempNode;
        }else {
            tail.next = tempNode;
            tempNode.prev = tail;
            tail = tempNode;
        }
        size++;
    }
    public void clear() {  //清空链表
        head = null;
        tail = null;
        size = 0;
    }
    public boolean contains(E o) {  //判断元素o是否包含于链表
        int tempSize = size;
        Node tempNode = head;
        Boolean result = false;
        while (tempSize != 0) {
            Object o1 = tempNode.item;
            if(o.equals(o1)){
                result = true;
            }
            tempNode = tempNode.next;
            tempSize--;
        }
        return result;
    }
    public E get(int index) {  //获取指定节点
        Node<E> tempNode;
        if(index < 0 || index >= size) {
            return null;
        }else {
            if(index < (size >> 1)) {  //右移
                tempNode = head;
                for(int i=0;i<index;i++)
                    tempNode = tempNode.next;
                return tempNode.item;
            }else {
                tempNode = tail;
                for (int i = size-1; index < i; i--) {
                    System.out.println(index+ " " + i);
                    tempNode = tempNode.prev;
                }
                return tempNode.item;
            }
        }
    }
}

  

posted on 2019-02-23 21:01 正在修炼的标准程序猴 阅读() 评论() 编辑 收藏

版权声明:本文为noerror原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/noerror/p/10424205.html