亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

面試題:用 Java 逆序打印鏈表

2024-07-14 08:41:27
字體:
來源:轉載
供稿:網友

昨天的 Java 實現單例模式 中,我們的雙重檢驗鎖機制因為指令重排序問題而引入了 volatile 關鍵字,不少朋友問我,到底為啥要加 volatile 這個關鍵字呀,而它,到底又有什么神奇的作用呢?

對 volatile 這個關鍵字,在昨天的講解中我們簡單說了一下:被 volatile 修飾的共享變量,都會具有下面兩個屬性:

  • 保證不同線程對該變量操作的內存可見性。
  • 禁止指令重排序。

共享變量:如果一個變量在多個線程的工作內存中都存在副本,那么這個變量就是這幾個線程的共享變量。

可見性:一個線程對共享變量值的修改,能夠及時地被其它線程看到。

對于重排序,不熟悉的建議直接 Google 一下,這里也就不多提了。只需要記住,在多線程中操作一個共享變量的時候,一定要記住加上 volatile 修飾即可。

由于時間關系,我們還是得先進入今天的正題,對于 volatile 關鍵字,在要求并發編程能力的面試中還是很容易考察到的,后面我也會簡單給大家講解。

輸入一個單鏈表的頭結點,從尾到頭打印出每個結點的值。

我們的鏈表有很多,單鏈表,雙向鏈表,環鏈表等。這里是最普通的單鏈表模式,我們一般會在數據存儲區域存放數據,然后有一個指針指向下一個結點。雖然 Java 中沒有指針這個概念,但 Java 的引用恰如其分的填補了這個問題。

看到這道題,我們往往會很快反應到每個結點都有 next 屬性,所以要從頭到尾輸出很簡單。于是我們自然而然就會想到先用一個 while 循環取出所有的結點存放到數組中,然后再通過逆序遍歷這個數組,即可實現逆序打印單鏈表的結點值。

我們假定結點的數據為 int 型的。實現代碼如下:

public class Test05 {  public static class Node {    int data;    Node next;  }  public static void printLinkReverse(Node head) {    ArrayList<Node> nodes = new ArrayList<>();    while (head != null) {      nodes.add(head);      head = head.next;    }    for (int i = nodes.size() - 1; i >= 0; i--) {      System.out.print(nodes.get(i).data + " ");    }  }  public static void main(String[] args) {    Node head = new Node();    head.data = 1;    head.next = new Node();    head.next.data = 2;    head.next.next = new Node();    head.next.next.data = 3;    head.next.next.next = new Node();    head.next.next.next.data = 4;    head.next.next.next.next = new Node();    head.next.next.next.next.data = 5;    printLinkReverse(head);  }}

這樣的方式確實能實現逆序打印鏈表的數據,但明顯用了整整兩次循環,時間復雜度為 O(n²)。等等!逆序輸出?似乎有這樣一個數據結構可以完美解決這個問題,這個數據結構就是棧。

棧是一種「后進先出」的數據結構,用棧的原理更好能達到我們的要求,于是實現代碼如下:

public class Test05 {  public static class Node {    int data;    Node next;  }  public static void printLinkReverse(Node head) {    Stack<Node> stack = new Stack<>();    while (head != null) {      stack.push(head);      head = head.next;    }    while (!stack.isEmpty()) {      System.out.print(stack.pop().data + " ");    }  }  public static void main(String[] args) {    Node head = new Node();    head.data = 1;    head.next = new Node();    head.next.data = 2;    head.next.next = new Node();    head.next.next.data = 3;    head.next.next.next = new Node();    head.next.next.next.data = 4;    head.next.next.next.next = new Node();    head.next.next.next.next.data = 5;    printLinkReverse(head);  }}

既然可以用棧來實現,我們也極容易想到遞歸也能解決這個問題,因為遞歸本質上也就是一個棧結構。要實現逆序輸出鏈表,我們每訪問一個結點的時候,我們先遞歸輸出它后面的結點,再輸出該結點本身,這樣鏈表的輸出結果自然也是反過來了。

代碼如下:

public class Test05 {  public static class Node {    int data;    Node next;  }  public static void printLinkReverse(Node head) {    if (head != null) {      printLinkReverse(head.next);      System.out.print(head.data+" ");    }  }  public static void main(String[] args) {    Node head = new Node();    head.data = 1;    head.next = new Node();    head.next.data = 2;    head.next.next = new Node();    head.next.next.data = 3;    head.next.next.next = new Node();    head.next.next.next.data = 4;    head.next.next.next.next = new Node();    head.next.next.next.next.data = 5;    printLinkReverse(head);  }}

雖然遞歸代碼看起來確實很整潔,但有個問題:當鏈表非常長的時候,一定會導致函數調用的層級很深,從而有可能導致函數調用棧溢出。所以顯示用?;谘h實現的代碼,健壯性還是要好一些的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲第一页| 日韩在线视频二区| 日韩精品免费一线在线观看| 91天堂在线观看| 日产日韩在线亚洲欧美| 久久综合伊人77777尤物| 国产精品美女午夜av| 欧美在线激情视频| 亚洲欧美国产va在线影院| 国产成人黄色av| 日本成熟性欧美| 成人欧美一区二区三区黑人| 日韩免费在线看| 国内精品久久久久| 亚洲欧美精品伊人久久| 伊是香蕉大人久久| 久久精品一区中文字幕| 色无极影院亚洲| 亚洲一区亚洲二区| 成人福利视频网| 成人国产精品免费视频| 在线观看免费高清视频97| 欧美成人一区二区三区电影| 欧美大成色www永久网站婷| 国产精品久久久久国产a级| 91麻豆桃色免费看| 亚洲a成v人在线观看| 国产97在线亚洲| 97免费在线视频| 国产精品啪视频| 日韩男女性生活视频| 欧美裸体xxxx极品少妇软件| 日韩成人av网址| 国产裸体写真av一区二区| 久久久久久有精品国产| 国产日韩欧美在线播放| 亚洲电影免费观看高清| 欧美极度另类性三渗透| 国产视频久久网| 欧美极品少妇xxxxⅹ喷水| 日韩av影院在线观看| 成人妇女免费播放久久久| 久久精品成人动漫| 亚洲老板91色精品久久| 久久人人爽亚洲精品天堂| 欧美日韩美女在线观看| 久久影视免费观看| 亚洲视频一区二区三区| 国产精品入口日韩视频大尺度| 美女视频久久黄| 在线日韩中文字幕| 亚洲第一福利网| 日韩成人网免费视频| 久久久久亚洲精品成人网小说| 久久噜噜噜精品国产亚洲综合| 亚洲男人的天堂网站| 久久亚洲精品一区| 久久精品色欧美aⅴ一区二区| 精品偷拍一区二区三区在线看| 久久精品夜夜夜夜夜久久| 亚洲电影在线看| 国产精品video| 日韩电视剧在线观看免费网站| 91老司机在线| 欧美大成色www永久网站婷| 91视频国产精品| 欧美怡春院一区二区三区| 日韩av网址在线观看| 亚洲欧美日韩精品久久奇米色影视| 日韩视频中文字幕| 日韩在线观看成人| 中文一区二区视频| 91精品国产综合久久男男| 在线精品国产成人综合| 亚洲人成电影网站| 亚洲成色999久久网站| 亚洲精品视频在线观看视频| 日韩有码在线电影| 国产69精品久久久| 亚洲色图狂野欧美| 国产精品福利小视频| 国产91精品久久久| 欧美精品久久久久| 亚洲精品98久久久久久中文字幕| 久久视频国产精品免费视频在线| 成人黄色免费片| 亚洲精品suv精品一区二区| 欧洲日本亚洲国产区| 宅男66日本亚洲欧美视频| 91精品在线观看视频| 国产色综合天天综合网| 日韩在线免费av| 狠狠色噜噜狠狠狠狠97| 亚洲人成网站777色婷婷| 国产日韩欧美日韩| 久久免费少妇高潮久久精品99| 欧洲亚洲免费在线| 亚洲国产精品小视频| 欧美日韩一区二区三区在线免费观看| 日韩免费观看高清| 亚洲无线码在线一区观看| 国产精品久久久久久久久影视| 精品激情国产视频| 国产日韩一区在线| 精品国产一区二区三区久久狼5月| 欧美国产亚洲精品久久久8v| 久久免费视频观看| 久久免费少妇高潮久久精品99| 91中文字幕在线观看| 欧美区二区三区| 欧美理论电影在线播放| 7m第一福利500精品视频| 国产97在线播放| 国产日韩欧美一二三区| 国产欧美一区二区白浆黑人| 欧美一级免费看| 成人激情视频在线观看| 国产精品美女主播在线观看纯欲| 欧美精品xxx| 精品调教chinesegay| 亚洲xxxxx电影| 欧美一区二区影院| 精品成人av一区| 国产精品美女免费视频| 最近2019中文字幕第三页视频| 日韩亚洲国产中文字幕| 亚洲国产成人精品女人久久久| 在线观看中文字幕亚洲| 日韩精品免费综合视频在线播放| 88xx成人精品| 色av中文字幕一区| 伊人青青综合网站| 欧美性20hd另类| 91高潮精品免费porn| 欧美日韩精品在线播放| 日本欧美一二三区| 精品久久久久久久中文字幕| 久久成人免费视频| 91国内揄拍国内精品对白| 亚洲a在线播放| 亚洲丝袜一区在线| 欧美成人黑人xx视频免费观看| 久久精品亚洲国产| 国产精品va在线| 亚洲欧美国产日韩中文字幕| 亚洲xxxx做受欧美| 国产精品国产亚洲伊人久久| 亚洲jizzjizz日本少妇| 这里只有视频精品| 久久免费国产精品1| 性欧美视频videos6一9| 欧美日韩精品在线视频| 精品久久久久久久久久ntr影视| 国产99久久久欧美黑人| 奇米成人av国产一区二区三区| 国产精品视频区1| 韩国v欧美v日本v亚洲| 久久久久亚洲精品| 精品视频偷偷看在线观看| 91天堂在线观看| 日韩成人av网| 国产一区香蕉久久| 综合激情国产一区| 欧美性猛交xxxx免费看久久久|