Python 資料結構之旋轉鏈表

來源:互聯網
上載者:User
題目描述:給定一個鏈表,旋轉鏈表,使得每個節點向右移動k個位置,其中k是一個非負數

範例:給出鏈表1->2->3->4->5->null和k=2;返回4->5->1->2->3->null

首先,觀察一下這個題目要達到的目的,其實,換一種說法,可以這樣來描述:給出一個k值,將鏈表從倒數第k個節點處起之後的部分移動到鏈表前面,就範例來說,其實是將4->5這一部分移動到整個鏈表前面,變成4->5->1->2->3->null。不過,需要注意的是,題中沒有給出k的大小,當k比鏈表的長度還大的時候,我們就需要先用k對鏈表的長度求餘,比如,如果k = 7,那麼上面的例子還是將4->5移動到整個鏈表前面。

所以說,這個題的思路可以這樣來總結:

1. 先求出整個鏈表的長度
2. 根據k值找到需要移動的部分鏈表的前驅(範例中的3)
3. 在前驅之後將鏈表斷開,移動後半部分

代碼如下:

# Definition for singly-linked list. # class ListNode: #   def __init__(self, x): #     self.val = x #     self.next = None  class Solution:   # @param head: the list   # @param k: rotate to the right k places   # @return: the list after rotation   def rotateRight(self, head, k):     if head is None:       return head     cur = head     count = 1     # 計算鏈表長度     while cur.next:       cur = cur.next       count += 1     # 為節省代碼量,這裡是一個很有技巧的處理:用尾節點連結頭結點     cur.next = head     # 此處,k為cur從尾節點到要斷開部分的前驅需走的步數     k = count - k % count     # 找到前驅     while k != 0:       cur = cur.next       k -= 1     # 斷開     head = cur.next     cur.next = None     # 因為首尾已經相連,所以直接返回前驅後面的那個節點即可,此處引用為head     return head     # write your code here

需要注意的是21行首尾相連的技巧,這大大節省了我們的代碼量,其實,就按之前思路中所描述的一步步來,也沒問題。但是這個技巧確實很棒,值得學習。具體的細節我寫在了代碼注釋裡。

感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.