算法練習(38): 鏈表的增刪查改4(1.3.28-1.3.31)

本系列博客習題來自《算法(第四版)》拾稳,算是本人的讀書筆記,如果有人在讀這本書的腊脱,歡迎大家多多交流访得。為了方便討論,本人新建了一個微信群(算法交流)陕凹,想要加入的悍抑,請?zhí)砑游业奈⑿盘枺簔hujinhui207407 謝謝。另外杜耙,本人的個人博客 http://www.kyson.cn 也在不停的更新中搜骡,歡迎一起討論

算法(第4版)

知識點

  • 鏈表節(jié)點增刪查改
  • 環(huán)形鏈表

題目

1.3.28 用遞歸的方法解答上一道練習


1.3.28 Develop a recursive solution to the previous question.

題目

1.3.29 用環(huán)形鏈表實現(xiàn)Queue。環(huán)形鏈表也是一條鏈表佑女,只是沒有任何結點鏈接為空记靡,且只要鏈表非空則last.next的值就為first。只能使用一個Node類型的實例變量(last)珊豹。


1.3.29 Write a Queue implementation that uses a circular linkedlist,which is the same as a linked list except that no links are null and the value of last.next is first when- ever the list is not empty. Keep only one Node instance variable (last).

答案

public class CircularLinkedListQueue<Item> implements Iterable<Item>{
    
    private class Node<Item> {
        Item item;
        Node<Item> next;
    }

    private Node<Item> last;
    private int N = 0;

    public void enqueue(Item item) {
        Node<Item> node = new Node<Item>();
        node.item = item;
        if (this.isEmpty()) {
            node.next = node;
            last = node;
            N++;
        }else {
            node.next = last.next;
            last.next = node;
            last = node;
            N++;
        }
    }

    public Item dequeue() {
        if (this.isEmpty()) {
            return null;
        }
        Node<Item> first = last.next;
        last.next = last.next.next;
        N--;
        return first.item;
    }

    public boolean isEmpty(){
        return last == null;
    }
    
    public Iterator<Item> iterator() {
        return new QueueIterator();
    }

    private class QueueIterator implements Iterator<Item>
    {
        Node<Item> current = last;
        int index = 0;
        
        public boolean hasNext() {
            if (last == null) {
                return false;
            }
            if (index < N) {
                return true;
            }
            return false;
        }

        public Item next() {
            current = current.next;
            index++;
            return current.item;
        }

        public void remove() {
            
        }
        
    }
    
    public static void main(String[] args) {
        CircularLinkedListQueue<String> queue = new CircularLinkedListQueue<String>();
        queue.enqueue("我的");
        queue.enqueue("名字");
        queue.enqueue("叫");
        queue.enqueue("頂級程序員不穿女裝");
        queue.enqueue("微博:https://m.weibo.cn/p/1005056186766482");
        queue.dequeue();
        queue.dequeue();
        
        for (String string : queue) {
            System.out.println(string);
        }
        System.out.println(queue);      
    }   
}

代碼索引

CircularLinkedListQueue.java

題目

1.3.30 編寫一個函數(shù)簸呈,接受一條鏈表的首結點作為參數(shù),(破壞性地)將鏈表反轉并返回結果鏈表的首結點店茶。

image.png

image.png


1.3.30 Write a function that takes the first Node in a linked list as argument and (de- structively) reverses the list, returning the first Node in the result.
Iterative solution : To accomplish this task, we maintain references to three consecutive nodes in the linked list, reverse, first, and second. At each iteration, we extract the node first from the original linked list and insert it at the beginning of the reversed list. We maintain the invariant that first is the first node of what’s left of the original list, second is the second node of what’s left of the original list, and reverse is the first node of the resulting reversed list.

public Node reverse(Node x)
{
   Node first   = x;
   Node reverse = null;
   while (first != null)
   {
      Node second = first.next;
      first.next  = reverse;
      reverse     = first;
      first       = second;
   }
   return reverse;
}

When writing code involving linked lists, we must always be careful to properly handle the exceptional cases (when the linked list is empty, when the list has only one or two nodes) and the boundary cases (dealing with the first or last items). This is usually much trickier than handling the normal cases.
Recursive solution : Assuming the linked list has N nodes , we recursively reverse the last N – 1 nodes, and then carefully append the first node to the end.

public Node reverse(Node first)
    {
       if (first == null) return null;
       if (first.next == null) return first;
       Node second = first.next;
       Node rest = reverse(second);
       second.next = first;
       first.next  = null;
       return rest;
}

答案

public class LinkedListExecise8<Item> {

    private static class Node<Item> {
        Node next;
        Item item;

        public String toString() {
            return "item:" + item;
        }
    }
    
    public static Node reverse(Node x){
        Node first = x;
        Node reverse = null;
        while(first != null){
                  Node second = first.next;  
                  first.next = reverse;  
                  reverse = first;  
                  first = second;           
        }
        return reverse;
    }

    public static void main(String[] args) {
        /**
         * 創(chuàng)建鏈表
         */
        Node<String> first = new Node<String>();
        Node<String> second = new Node<String>();
        Node<String> third = new Node<String>();
        Node<String> forth = new Node<String>();
        Node<String> fifth = new Node<String>();
        first.item = "我的";
        first.next = second;
        second.item = "名字";
        second.next = third;
        third.item = "叫";
        third.next = forth;
        forth.item = "頂級程序員不穿女裝";
        forth.next = fifth;
        fifth.item = "微博:https://m.weibo.cn/p/1005056186766482";
        fifth.next = null;
        
        Node newFirst = reverse(first);
        Node current = newFirst;
        while (current != null) {
            System.out.println(current.item);
            current = current.next;
        }
    }
}

代碼索引

LinkedListExecise8.java

題目

1.3.31 實現(xiàn)一個嵌套類DoubleNode用來構造雙向鏈表蜕便,其中每個結點都含有一個指向前驅元素的引用和一個指向后續(xù)元素的引用(如果不存在則為null)。為以下任務實現(xiàn)若干靜態(tài)方法:在頭插入結點贩幻、在表尾插入結點轿腺、從表頭刪除結點、從表尾刪除結點丛楚、在指定結點前插入新結點族壳、在指定結點之后插入新結點、刪除指定結點趣些。


1.3.31 Implement a nested class DoubleNode for building doubly-linked lists, where each node contains a reference to the item preceding it and the item following it in the list (null if there is no such item). Then implement static methods for the following tasks: insert at the beginning, insert at the end, remove from the beginning, remove from the end, insert before a given node, insert after a given node, and remove a given node.

廣告

我的首款個人開發(fā)的APP壁紙寶貝上線了仿荆,歡迎大家下載。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拢操,隨后出現(xiàn)的幾起案子锦亦,更是在濱河造成了極大的恐慌,老刑警劉巖令境,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杠园,死亡現(xiàn)場離奇詭異,居然都是意外死亡舔庶,警方通過查閱死者的電腦和手機抛蚁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惕橙,“玉大人瞧甩,你說我怎么就攤上這事∶逐校” “怎么了亲配?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惶凝。 經常有香客問我,道長犬钢,這世上最難降的妖魔是什么苍鲜? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮玷犹,結果婚禮上混滔,老公的妹妹穿的比我還像新娘。我一直安慰自己歹颓,他們只是感情好坯屿,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巍扛,像睡著了一般领跛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撤奸,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天吠昭,我揣著相機與錄音,去河邊找鬼胧瓜。 笑死矢棚,一個胖子當著我的面吹牛,可吹牛的內容都是我干的府喳。 我是一名探鬼主播蒲肋,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了兜粘?” 一聲冷哼從身側響起申窘,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妹沙,沒想到半個月后偶洋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡距糖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年玄窝,在試婚紗的時候發(fā)現(xiàn)自己被綠了悍引。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俩块。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡联贩,死狀恐怖泪幌,靈堂內的尸體忽然破棺而出祸泪,到底是詐尸還是另有隱情没隘,我是刑警寧澤升略,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站罩旋,受9級特大地震影響瓜饥,放射性物質發(fā)生泄漏乓土。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一喳挑、第九天 我趴在偏房一處隱蔽的房頂上張望伊诵。 院中可真熱鬧询张,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窄刘。三九已至,卻和暖如春翻伺,著一層夾襖步出監(jiān)牢的瞬間拉宗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工单料, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掠廓。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓换怖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蟀瞧。 傳聞我的和親對象是個殘疾皇子沉颂,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,737評論 0 33
  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,427評論 0 23
  • 杏壇回望意恬恬悦污。正華年铸屉,慕先賢,美夢幸得圓切端。 稚童盈室露歡顏彻坛。繪流泉,誦詩篇踏枣,鳥雀探窗檐昌屉。居教苑,自心安茵瀑。
    蘭澤君閱讀 284評論 1 6
  • 19DA以后马昨,大多股票都像犯病了一樣蜻牢,不停盤整烤咧,反反復復,感覺整個大盤進入了一陣低迷期抢呆。但是煮嫌,上周一支股票卻格外的...
    淘氣的絡腮胡閱讀 292評論 0 0
  • Autumn 秋。 之所以叫秋抱虐,是因為我喜歡秋天 一個懷念的季節(jié)昌阿。 不一定要在布滿落葉的林...
    馥徴閱讀 253評論 0 0