1. 程式人生 > >DoubleLinkedList獨立實現,不依賴任何包

DoubleLinkedList獨立實現,不依賴任何包

public class DoubleLinkedList<E> {

    class Node<E> {

        element;
        Node prev;
        Node next;

        public Node(element) {
            //constructor with args
this.element = element;
        }

        public Node() {
            //constructor without args
}

        @Override
public String toString() {
            return this.element.toString();
        }
    }

    private Node first null;
    private Node last null;

    /**
     * 連結結點到連結串列首部
     * @param node
*/
private void linkFirst(Node node) {
        if (first == null || last == null) {
            first last = node;
        }
        node.next 
first;
        first.prev = node;
        first = node;
    }

    /**
     * 連結結點到連結串列尾部
     * @param node
*/
private void linkLast(Node node) {
        last.next = node;
        node.prev last;
        last = node;
    }

    /**
     * 連結一個結點到連結串列中間
     * @param node1 要連結的結點
     * @param node2 連結點位置的結點
     * example:
     *    [插入前]node -> node2 -> node3
     *    [插入後]node -> node1 -> node2 -> node3
     */
private void link(Node node1, Node node2) {
        Node node = node2.prev;
        node.next = node1;
        node1.prev = node;
        node1.next = node2;
        node2.prev = node1;

    }

    /**
     * 移除某個節點
     * @param node
*/
public void unlink(Node node) {
        Node prevNode = node.prev;
        Node nextNode = node.next;
        prevNode.next = nextNode;
        nextNode.prev = prevNode;
    }

    /**
     * 移除首結點
     */
private void unlinkFirst() {
        first first.next;
        first.prev null;
    }

    /**
     * 移除尾結點
     */
private void unlinkLast() {
        last last.prev;
        last.next null;
    }

    /**
     * 根據索引獲取結點
     * @param index
@return
*/
private Node getNode(int index) {
        Node node = first;
        Node currentNode = new Node();
        if (index == 0) {
            currentNode = first;
        }

        if (index >= size()) {
            throw new IndexOutOfBoundsException(errMessage(index));
        }
        else {
            int i = 0;
            while (i <= index) {
                if (node != null) {
                    currentNode = node;
                    node = node.next;
                }
                i++;
            }
        }
        return currentNode;

    }

    /**
     * 統計連結串列裡面所有元素的個數
     * @return 總的元素的個數
     */
public int size() {
        Node node = first;
        int count = 0;
        while (node != null) {
            count++;
            node = node.next;
        }
        return count;
    }

    /**
     * 錯誤訊息顯示
     * @param index
@return
*/
private String errMessage(int index) {
        return "Size: "+ size() + ", index: "+ index;
    }

    /**
     * 插入元素到連結串列中
     * @param index
@param element
*/
public void insert(int index, element) {
        Node node = new Node<E>(element);
        if (index == 0) {
            linkFirst(node);
        }
        if (index < || index >= size()) {
            throw new IndexOutOfBoundsException(errMessage(index));
        }
        if (index == size() -1) {
            linkLast(node);
        }
        else {
            Node node1 = getNode(index);
            link(node, node1);
        }

    }

    /**
     * 新增元素到連結串列
     * @param element
*/
public void add(element) {
        Node node = new Node<E>(element);
        linkFirst(node);
    }

    /**
     * 新增元素到連結串列首部
     * @param element
*/
public void addFirst(element) {
        Node node = new Node<E>(element);
        linkFirst(node);
    }

    /**
     * 新增元素到連結串列尾部
     * @param element
*/
public void addLast(element) {
        Node node = new Node<E>(element);
        linkLast(node);
    }

    /**
     * 移除指定索引下得元素
     * @param index
*/
public void remove(int index) {
        if (index == 0) {
            unlinkFirst();
        }
        else if (index == size() -){
            unlinkLast();
        }
        else if (index < || index >= size()) {
            throw new IndexOutOfBoundsException(errMessage(index));
        }
        else {
            Node node = getNode(index);
            unlink(node);
        }
    }

    /**
     * 移除最後一個元素
     */
public void removeLast() {
        unlinkLast();
    }

    /**
     * 移除第一個元素
     */
public void removeFirst() {
        unlinkFirst();
    }

    /**
     * 清空連結串列
     */
public void clear() {
        first null;
    }

    /**
     * 判斷連結串列是否為空
     * @return
*/
public boolean isEmpty() {
        return first == null;
    }

    /**
     * 過載toString方法
     * @return
*/
@Override
public String toString() {
        Node node = first;
        StringBuilder stringBuilder = new StringBuilder();
        if (node == null) {
            return "{}";
        }
        else {
            stringBuilder.append("{ ");
            while (node != null) {
                stringBuilder.append("["+ node.toString() +"],");
                node = node.next;
            }
        }
        String result = stringBuilder.toString();
        int index = result.lastIndexOf(",");
        return result.substring(0, index) + " }";
    }

    /**
     * 判斷某個元素是否在連結串列中
     * @param element
@return
*/
public boolean contains(element) {
        return getIndexOf(element) != -1;
    }

    /**
     * 獲取一個元素
     * @param index
@return
*/
public get(int index) {
        return (E) getNode(index).element;
    }

    /**
     * 獲取最後一個元素
     * @return
*/
public getLast() {
        return (Elast.element;
    }

    /**
     * 獲取第一個元素
     * @return
*/
public getFirst() {
        return (Efirst.element;
    }

    /**
     * 替換特定索引的元素
     * @param index
@param element
*/
public void replace(int index, element) {
        getNode(index).element = element;
    }

    /**
     * 獲取某個元素的索引,這裡通常是第一次出現的索引
     * @param element
@return
*/
public int getIndexOf(element) {
        int index = 0;
        if (element == null) {
            for (Node<E> node = first; node != null; node = node.next) {
                if (node.element == null) {
                    return index;
                }
                index++;
            }
        }
        else {
            for (Node<E> node = first; node != null; node = node.next) {
                if (node.element.equals(element)) {
                    return index;
                }
                index++;
            }
        }
        return -1;
    }

    /**
     * 獲取某個元素最後一次出現的索引
     * @param element
@return
*/
public int getLastIndexOf(element) {
        int index = size();
        if (element == null) {
            for (Node<E> node = last; node != null; node = node.prev) {
                index--;
                if (node.element == null) {
                    return index;
                }
            }
        }
        else {
            for (Node<E> node = last; node != null; node = node.prev) {
                index--;
                if (node.element.equals(element)) {
                    return index;
                }
            }
        }
        return -1;
    }

    /**
     * 移除某個元素第一次出現的位置
     * @param element
*/
public void removeFirstOccurrence(element) {
        if (element == null) {
            return;
        }
        int index = getIndexOf(element);
        remove(index);

    }

    /**
     * 移除某個元素最後一次出現的位置
     * @param element
*/
public void removeLastOccurrence(element) {
        if (element == null) {
            return;
        }
        int index = getLastIndexOf(element);
        remove(index);
    }

相關推薦

DoubleLinkedList獨立實現依賴任何

public class DoubleLinkedList<E> {     class Node<E> {         E element;         Node prev;         Node next;         public Node(E element) 

java最簡單複製檔案方法依賴任何框架

java最簡單複製檔案方法   把java2.txt內容複製到java.txt中   import java.io.File; import java.io.IOException; import java.nio.file.Files; im

依賴任何系統API用c語言實現gbk/utf8/unicode編碼轉換

轉載地址:https://blog.csdn.net/bladeandmaster88/article/details/54837338 漢字'我' Unicode編碼是0x6211       01100010 00010001 UTF8編碼是&

微信瀏覽器內任何操作直接啟動外部瀏覽器是怎麼實現

做微信營銷活動或者APK下載推廣時候,域名被經常被封,做到微信中正常使用呢?這就要藉助一些工具來實現有效的操作。先來認識一下微信遮蔽的原理。按原理逐個攻破,本人做防封一年來自認為得心應手 工具介紹: 月牙跳轉是一款基於微信後端開發了一款微信營銷下載推廣助手,使用了本外掛生成的連結,使用者在微信任意環境下點

ffmpeg實戰教程(十一)手把手教你實現直播功能依賴第三方SDK

先上圖: 推流的手機 拉流的網頁和VL播放器 拉流的手機客戶端 對於nginx伺服器的搭建之前有寫過: 這篇也建議看一下: 下面開始實現手機直播功能 1

div/dom元素拖拽縮放外掛純js實現拖拽縮放依賴jQuery~

產品需求,需要用到對div(dom)進行拖拽縮放操作,看到有好多外掛,要麼依賴jQuery,要麼檔案太大。 封裝了一個外掛,不壓縮狀態下5KB。 html <!DOCTYPE html> <html lang="en"> <head> <

在Excel中利用任何第三方工具生成二維碼

pdf ng- ref mac 源碼 generated code 而是 git 有同事提需求,要批量生成二維碼。談了之後,我覺得可以做個excel文件,把要打印的內容放進去,然後給每行數據生成一個二維碼。下一步就要在Excel裏面生成二維碼。問了一下度娘,貌似都得利用一些

phpmyadmin-錯誤:配置文件權限錯誤任何用戶都能修改!這裏有答案

highlight 文字 所有權限 配置文件 inux style true 所有 整理 今天在linux下使用phpMyadmin的時候突然出現這個紅色警告。差點把我嚇暈在電腦前。不過冷靜想一下這個報錯,肯定就是linux權限那幾個 ‘7’ 惹的禍。 於是 通過命令

無限極結構循環適用任何數組函數一次循環並根據給出的root 快速篩選

PHP 無限極分類 一次循環 不使用任何函數 <?php$nodesArrays = [[‘id‘ => 1, ‘pid‘ => 0, ‘name‘ => ‘a‘],[‘id‘ => 2, ‘pid‘ => 0, ‘name‘ => ‘b‘],[‘id

spring-boot-2.0.3之redis快取實現是你想的那樣哦!

前言   開心一刻     小白問小明:“你前面有一個5米深的坑,裡面沒有水,如果你跳進去後該怎樣出來了?”小明:“躺著出來唄,還能怎麼出來?”小白:“為什麼躺著出來?”小明:“5米深的坑,還沒有水,跳下去不死就很幸運了,殘是肯定會殘的,不躺著出來,那能怎麼出來?”小白:“假設沒死也沒殘呢?”小明:“你當

spring-boot-2.0.3之redis快取實現是你想的那樣哦

前言  開心一刻     小白問小明:“你前面有一個5米深的坑,裡面沒有水,如果你跳進去後該怎樣出來了?”小明:“躺著出來唄,還能怎麼出來?”小白:“為什麼躺著出來?”小明:“5米深的坑,還沒有水,跳下去不死就很幸運了,殘是肯定會殘的,不躺著出來,那能怎麼出來?”小白:“假設沒死也沒殘呢?”小明:“你當我超

tomcat配置指定啟動jdk版本依賴環境變數

1.windows下 開啟tomcat解壓目錄下的\bin\setclasspath.bat檔案,在指令碼開始新增下面兩行設定 set JAVA_HOME=D:\Program Files\Java\jdk8\jdk1.8.0_50 set JRE_HOME=D:\Program Files\Jav

神奇的css3任何邏輯也能做選項卡切換

相信大家做選項卡切換的時候都是用js或者jq完成的,但是有沒有想過,樣式表也能直接做呢? 今天就教大家如何實現, 主要是用到一些css3的屬性, 基礎操作,先佈局 <label> <input type="radio" name

關於IE8支援placeholder完美解決方案需要任何外掛

  最近有好多人諮詢我IE8不支援placeholder的問題,自己寫了一個demo以供參考。   js部分 1 function input_focus(e){ 2 $(e).css("color","#000000"); 3 if($(e).val()=="請輸入文字"){ 4

Android控制手電筒程式碼簡單易用需要任何許可權

1.控制手電筒開關的工具類:public class FlashUtils { private CameraManager manager; private Camera mCamera = null; private Context context;

Struts2配置本地載入DTD依賴聯網

在eclipse/myeclipse中,可以在“設定”中關聯本地dtd,具體如下圖 但是這種方式離開ide關聯性應該就失效了(未驗證,猜的),個人覺得更好的方法是直接在xml標頭檔案聲明裡就指向本地,而不是網路地址,搜了下,具體做法是將PUBLIC改為SYSTEM,網路

mvc中適用任何table表格樣式進行標題(table的首行)的固定展示

效果圖: 1.table的格式  <div class='Table-Cont' id='Table-Cont'>             <table class="table table-res

Android 2個Service實現相互保活通過bindservice來實現通過廣播實現

1,實現原理:啟動2個Service,相互繫結監聽,當A Service監聽到連線斷開的時候,說明B服務可能被 Kill掉了,這時需要重新開啟A服務,同樣B服務的監聽斷掉了,重新啟動A服務。A,B兩個服務都是單獨的程序,需要使用AIDL來通訊。 2,A服務原始碼: public class

perl 將檔案複製到另一個檔案任何改動。

最近一直都在用perl寫東西,感覺perl用起來很舒服,而且規範不是那麼嚴格,很喜歡! 例子:將檔案複製到另一個檔案,不做任何改動。(如果有perl的問題,歡迎提問,大家一起討論) $input  = @ARGV[0]; $output = @ARGV[1]; open INPUT, $inpu

最簡單的java獲取微信小程式openid的方法需要jar

@RequestMapping("getUserOpenId") @ResponseBody public String getUserOpenId(String appid, String js_code, String secret) {//  System.out.println("appid"+app