首頁  >  文章  >  後端開發  >  Python 資料結構之旋轉鍊錶

Python 資料結構之旋轉鍊錶

高洛峰
高洛峰原創
2017-02-28 09:22:481174瀏覽

題目描述:給定一個鍊錶,旋轉鍊錶,使得每個節點向右移動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行首尾相連的技巧,這大大節省了我們的程式碼量,其實,就按之前思路中所描述的一步步來,也沒問題。但是這個技巧確實很棒,值得學習。具體的細節我寫在程式碼註解裡了。

謝謝閱讀,希望能幫助大家,謝謝大家對本站的支持!

更多Python 資料結構之旋轉鍊錶相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn