1. ?LeetCode刷題實戰(zhàn)206:反轉(zhuǎn)鏈表

        共 2854字,需瀏覽 6分鐘

         ·

        2021-03-14 14:06

        算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎知識和業(yè)務邏輯面試+算法面試。所以,為了提高大家的算法能力,這個公眾號后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

        今天和大家聊的問題叫做 反轉(zhuǎn)鏈表,我們先來看題面:
        https://leetcode-cn.com/problems/reverse-linked-list/

        Given the head of a singly linked list, reverse the list, and return the reversed list.

        題意

        反轉(zhuǎn)一個單鏈表。

        示例


        輸入: 1->2->3->4->5->NULL
        輸出: 5->4->3->2->1->NULL

        進階:
        你可以迭代或遞歸地反轉(zhuǎn)鏈表。你能否用兩種方法解決這道題?


        解題


        思路一:遞歸地反轉(zhuǎn)鏈表

        遞歸的終止條件:
        (1)head為null,直接返回head。
        (2)head.next為null,直接返回head。

        遞歸的過程:
        我們新的頭節(jié)點記為newHead,其值應該是翻轉(zhuǎn)以head.next為頭節(jié)點的鏈表的結(jié)果。同時把head放在head.next的后面,并令head.next為null,這樣我們就把head元素放在了新鏈表的末尾。
        由于涉及到遞歸,而每一次遞歸的時間復雜度都是O(1)級別的,因此時間復雜度和空間復雜度都是O(n)級別的,其中n為鏈表中的節(jié)點個數(shù)。

        JAVA代碼:


        public class Solution {
          
          public ListNode reverseList(ListNode head) {
            if(head == null || head.next == null) {
              return head;
            }
            ListNode newHead = reverseList(head.next);
            head.next.next = head;
            head.next = null;
            return newHead;
          }
        }


        思路二:非遞歸地反轉(zhuǎn)鏈表

        鏈表相關的題,多設指針,在草稿紙上多演練幾次,一定能夠輕松解決。
        設立虛擬頭節(jié)點dummyHead和三個指針cur1、cur2、cur3反轉(zhuǎn)鏈表。
        令cur1指向虛擬頭節(jié)點dummyHead。
        如果cur1.next是一個空節(jié)點或者說cur1.next.next是一個空節(jié)點,即鏈表中沒有節(jié)點或鏈表中只有一個節(jié)點,無需翻轉(zhuǎn),直接返回head即可。
        令cur2指向cur1.next,cur3指向cur2.next。在我的定義中,cur2指向的是待處理節(jié)點的前一個節(jié)點,cur3指向的是待處理節(jié)點。只要cur3不為null,就進行以下循環(huán)。

        (1)令cur2.next指向cur3.next。
        (2)設立臨時變量temp存儲cur1.next結(jié)點。令cur1.next節(jié)點指向cur3,即將待處理節(jié)點放在第一個節(jié)點的位置,而令cur3.next為temp。
        (3)更新cur3的值為cur2.next。

        最后我們返回翻轉(zhuǎn)后的結(jié)果dummyHead.next即可。
        時間復雜度是O(n)級別的,其中n為鏈表中的節(jié)點數(shù)??臻g復雜度是O(1)級別的。

        JAVA代碼:


        public class Solution {
          
          public ListNode reverseList(ListNode head) {
            ListNode dummyHead = new ListNode(-1);
            dummyHead.next = head;
            ListNode cur1 = dummyHead;
            if(cur1.next == null || cur1.next.next == null) {
              return head;
            }
            ListNode cur2 = cur1.next;
            ListNode cur3 = cur2.next;
            while(cur3 != null) {
              cur2.next = cur3.next;
              ListNode temp = cur1.next;
              cur1.next = cur3;
              cur3.next = temp;
              cur3 = cur2.next;
            }
            return dummyHead.next;
          }
        }



        好了,今天的文章就到這里,如果覺得有所收獲,請順手點個在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動力 。

        上期推文:

        LeetCode1-200題匯總,希望對你有點幫助!

        LeetCode刷題實戰(zhàn)201:數(shù)字范圍按位與

        LeetCode刷題實戰(zhàn)202:快樂數(shù)

        LeetCode刷題實戰(zhàn)203:移除鏈表元素

        LeetCode刷題實戰(zhàn)204:計數(shù)質(zhì)數(shù)

        LeetCode刷題實戰(zhàn)205:同構字符串


        瀏覽 45
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 欧美老熟妇性爱 | 无码精品少妇一区二区三区蜜桃 | 国产清纯白嫩初高生在线 | 性生活视频播放 | 亚洲综合在线发布 |