<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2854字,需瀏覽 6分鐘

           ·

          2021-03-14 14:06

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

          今天和大家聊的問(wèn)題叫做 反轉(zhuǎn)鏈表,我們先來(lái)看題面:
          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)一個(gè)單鏈表。

          示例


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

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


          解題


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

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

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

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

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

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

          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;
            }
          }



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

          上期推文:

          LeetCode1-200題匯總,希望對(duì)你有點(diǎn)幫助!

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

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

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

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

          LeetCode刷題實(shí)戰(zhàn)205:同構(gòu)字符串


          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲视频在线免费播放 | 国产精品国产精品国产专区不片 | 黄色视频图片免费看 | 性久久久久久久久久 | 欧美老逼色色 |