Java數據結構與算法——鏈表(面試)

聲明:碼字不易,轉載請註明出處,歡迎文章下方討論交流。

前言:Java數據結構與算法專題會不定時更新,歡迎各位讀者監督。本文是上篇文章Java數據結構與算法——鏈表的擴展篇,介紹鏈表的特色,使用場景、鏈表的性能分析以及一道經典的鏈表面試題——鏈的反轉問題java

1.鏈表的特色

1)物理空間不連續,開銷大

鏈表因爲其特殊的存儲結構,其物理存儲空間不連續,所以須要額外的信息(指針)標記下一節點的地址,優勢是可利用操做系統的動態內存管理,缺點除存儲數據自己以外須要額外的開銷存放指針。面試

2)運行時能夠動態添加

和數組不一樣,鏈表能夠動態的添加元素和刪除元素,彌補了數組的缺陷算法

3)查找慢,增刪快

很顯然,查找須要遍歷,最差的狀況若是查找最後一個,則比較低效特別是鏈表比較長的時候。鏈表的增刪只須要操做指針便可,相比數組比較高效segmentfault

2.鏈表的適用場景

增刪頻繁的場合(隨着計算機技術的發展,空間已經再也不是主要矛盾,時間效率纔是)
若是同時存在即增刪又查找的場合,通常鏈表會配合散列表、棧、隊列一塊兒使用。數組

3.鏈表性能分析

鏈表的插入分爲頭插入尾插入中間插入,頭和尾的時間複雜度尾O(1),而中間插入須要遍歷,因此時間複雜度尾O(L),L爲鏈表長度。數據結構

一樣刪除也分爲頭刪除尾刪除中間刪除,頭刪除的時間複雜度是O(1),中間刪除和尾刪除因爲須要遍歷鏈表,因此時間複雜度爲O(L),L爲鏈表長度。性能

鏈表的查找,因爲須要遍歷,因此時間複雜度爲O(L),L爲鏈表長度。測試

4. 一道面試題——如何實現鏈表反轉

這是一道面試中常常出現的題,通常在面試中要求儘可能不用額外的空間實現。方法有不少,好比遍歷鏈表,而後依次使用頭插入的方式。還有一種方法,就是把鏈表的每一個指針反轉。操作系統

4.1 指針反轉實現鏈表反轉代碼
/**
     * 反轉鏈表
     */
    public void lindRevese(){
        Node temp = first;
        last = temp;
        Node next = first.getNext();
        for (int i = 0; i < size-1; i++) {
            Node nextNext = next.getNext(); //獲取當前下下個元素
            next.setNext(temp);
            temp = next;
            next = nextNext;
        }
        last.setNext(null);
        first = temp;
    }
4.2 測試
public class LinkReverse {
    public static void main(String[] args) {
        Link link = new Link();
        link.add(0,1); //1
        link.add(1,2); //1->2
        link.add(2,3); //1->2->3
        link.add(3,4); //1->2->3->4
        link.add(4,5); //1->2->3->4->5
        link.printLink();//1->2->3->4->5
        link.lindRevese();
        link.printLink();//5->4->3->2->1
    }    
}

代碼部分用到了上篇文章Java數據結構與算法——鏈表的代碼段,請移步獲取。指針

碼字不易,如對您有幫助,歡迎點贊收藏打賞^_^

相關文章
相關標籤/搜索