1. 程式人生 > >Java連結串列基本操作小總結

Java連結串列基本操作小總結

工作以來一直都忽略Java連結串列的簡單程式設計,在自己簡單的書寫後,發現其實連結串列也蠻好理解的。再簡單的資料結構也要自己手動敲敲,不然會反應遲鈍的~

package com.study.list;

/**
 * @program: TwoReverseLinedList
 * @description: 兩個節點反轉
 * @author: 
 * @create: 2018-11-14 11:10
 **/
public class TwoReverseLinedList<T> {

    private int size;

    private LinkNode<T> head;

    private LinkNode<T> tail;

    public static void main(String[] args) {

        TwoReverseLinedList<Integer> twoReverseLinedList = new TwoReverseLinedList<Integer>();

        for (int i = 0; i < 10; i++) {
            twoReverseLinedList.addByTail(i);
        }

        twoReverseLinedList.printLinkList();

        System.out.println();

        System.out.println("獲取元素是:" + twoReverseLinedList.get(0));

        System.out.println("該連結串列長度:" + twoReverseLinedList.size());

        twoReverseLinedList.reverse();

        System.out.println("方法一反轉後的連結串列");

        twoReverseLinedList.printLinkList();

        System.out.println();

        twoReverseLinedList.reverse1();

        System.out.println("方法二反轉後的連結串列");

        twoReverseLinedList.printLinkList();

        System.out.println();

        System.out.println("刪除指點節點後的連結串列");

        twoReverseLinedList.delete(0);

        twoReverseLinedList.printLinkList();

        System.out.println();

        System.out.println("新增指點節點後的連結串列");

        twoReverseLinedList.insert(0, 100);

        twoReverseLinedList.printLinkList();
    }

    /**
     * 增加節點 頭插法,head總是指向最新節點
     *
     * @param data
     */
    public void addByHead(T data) {
        if (null == this.head) {
            this.head = new LinkNode<T>();
        }

        LinkNode<T> newNode = new LinkNode<T>();
        newNode.setData(data);
        newNode.setNext(head);
        head = newNode;
        size++;
    }

    /**
     * 增加節點
     *
     * @param data
     */
    public void addByTail(T data) {
        if (null == this.head) {
            this.head = new LinkNode<T>();
            this.tail = this.head;
        }

        LinkNode<T> newNode = new LinkNode<T>();
        newNode.setData(data);
        tail.setNext(newNode);
        tail = newNode;
        size++;
    }

    /**
     * 列印連結串列
     */
    public void printLinkList() {
        if (null == head) {
            return;
        }

        LinkNode<T> tmp = head.getNext();
        System.out.print("連結串列如下: ");
        while (null != tmp) {
            System.out.print(tmp.getData() + "->");
            tmp = tmp.getNext();
        }
    }

    /**
     * 獲取資料
     *
     * @param index
     * @return
     */
    public T get(int index) {

        if (null == head) {
            throw new IllegalArgumentException("連結串列不存在");
        }

        if (-1 > index || index > size - 1) {
            throw new IllegalArgumentException("獲取位置異常");
        }

        if (-1 == index) {
            return null;
        }

        LinkNode<T> tmp = head.getNext();
        int count = 0;
        while (null != tmp) {
            if (count++ == index) {
                return tmp.getData();
            }
            tmp = tmp.getNext();
        }

        return null;
    }

    /**
     * 獲取指定節點
     *
     * @param index
     * @return
     */
    public LinkNode<T> getNode(int index) {

        if (null == head) {
            throw new IllegalArgumentException("連結串列不存在");
        }

        if (-1 > index || index > size - 1) {
            throw new IllegalArgumentException("獲取位置異常");
        }

        if (-1 == index) {
            return head;
        }

        LinkNode<T> tmp = head.getNext();
        int count = 0;
        while (null != tmp) {
            if (count++ == index) {
                return tmp;
            }
            tmp = tmp.getNext();
        }

        return null;
    }

    /**
     * 返回列表的長度
     *
     * @return
     */
    public int size() {
        return this.size;
    }

    /**
     * 反轉-值交換
     */
    public void reverse() {

        if (null == head) {
            return;
        }

        LinkNode<T> first = head.getNext();
        LinkNode<T> tmp;
        // 交換值實現
        while (null != first && null != first.getNext()) {
            tmp = first.getNext();
            T tmpData = first.getData();
            first.setData(tmp.getData());
            tmp.setData(tmpData);
            first = tmp.getNext();
        }
    }

    /**
     * 反轉-節點交換
     */
    public void reverse1() {

        if (null == head) {
            return;
        }

        LinkNode<T> first = head.getNext();
        LinkNode<T> base = head;
        LinkNode<T> second;
        // 交換值實現
        while (null != first && null != first.getNext()) {
            second = first.getNext();
            base.setNext(second);
            first.setNext(second.getNext());
            second.setNext(first);

            base = first;
            first = first.getNext();
        }
    }

    /**
     * 刪除指點的節點
     *
     * @param i
     */
    public void delete(int i) {

        LinkNode<T> node = getNode(i);
        if (null == node) {
            throw new IllegalArgumentException("刪除的目標節點不存在");
        }

        LinkNode<T> pre = getNode(i - 1);

        pre.setNext(node.getNext());

        size--;
    }

    /**
     * 指定位置插入
     *
     * @param data
     */
    public void insert(int index, T data) {

        if (null == head) {
            return;
        }

        LinkNode<T> node = getNode(index - 1);
        if (null == node) {
            throw new IllegalArgumentException("插入位置有誤");
        }

        LinkNode<T> tmp = new LinkNode<T>();
        tmp.setData(data);

        tmp.setNext(node.getNext());
        node.setNext(tmp);

        size++;
    }

    /**
     * 節點
     *
     * @param <T>
     */
    class LinkNode<T> {

        /**
         * 資料域
         */
        private T data;

        /**
         * 指標域
         */
        private LinkNode next;

        public LinkNode() {

        }

        public LinkNode(T data) {
            this.data = data;
        }

        public T getData() {
            return data;
        }

        public void setData(T data) {
            this.data = data;
        }

        public LinkNode getNext() {
            return next;
        }

        public void setNext(LinkNode next) {
            this.next = next;
        }
    }
}

執行結果:

連結串列如下: 0->1->2->3->4->5->6->7->8->9->
獲取元素是:0
該連結串列長度:10
方法一反轉後的連結串列
連結串列如下: 1->0->3->2->5->4->7->6->9->8->
方法二反轉後的連結串列
連結串列如下: 0->1->2->3->4->5->6->7->8->9->
刪除指點節點後的連結串列
連結串列如下: 1->2->3->4->5->6->7->8->9->
新增指點節點後的連結串列
連結串列如下: 100->1->2->3->4->5->6->7->8->9->