題目描述:給定一個鍊錶,旋轉鍊錶,使得每個節點向右移動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中文網!