国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python 數(shù)據(jù)結(jié)構(gòu)之旋轉(zhuǎn)鏈表

2020-02-23 04:23:49
字體:
供稿:網(wǎng)友

題目描述:給定一個(gè)鏈表,旋轉(zhuǎn)鏈表,使得每個(gè)節(jié)點(diǎn)向右移動(dòng)k個(gè)位置,其中k是一個(gè)非負(fù)數(shù)

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

首先,觀察一下這個(gè)題目要達(dá)到的目的,其實(shí),換一種說法,可以這樣來描述:給出一個(gè)k值,將鏈表從倒數(shù)第k個(gè)節(jié)點(diǎn)處起之后的部分移動(dòng)到鏈表前面,就樣例來說,其實(shí)是將4->5這一部分移動(dòng)到整個(gè)鏈表前面,變成4->5->1->2->3->null。不過,需要注意的是,題中沒有給出k的大小,當(dāng)k比鏈表的長度還大的時(shí)候,我們就需要先用k對鏈表的長度求余,比如,如果k = 7,那么上面的例子還是將4->5移動(dòng)到整個(gè)鏈表前面。

所以說,這個(gè)題的思路可以這樣來總結(jié):

1. 先求出整個(gè)鏈表的長度
2. 根據(jù)k值找到需要移動(dòng)的部分鏈表的前驅(qū)(樣例中的3)
3. 在前驅(qū)之后將鏈表斷開,移動(dòng)后半部分

代碼如下:

# 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     # 計(jì)算鏈表長度     while cur.next:       cur = cur.next       count += 1     # 為節(jié)省代碼量,這里是一個(gè)很有技巧的處理:用尾節(jié)點(diǎn)鏈接頭結(jié)點(diǎn)     cur.next = head     # 此處,k為cur從尾節(jié)點(diǎn)到要斷開部分的前驅(qū)需走的步數(shù)     k = count - k % count     # 找到前驅(qū)     while k != 0:       cur = cur.next       k -= 1     # 斷開     head = cur.next     cur.next = None     # 因?yàn)槭孜惨呀?jīng)相連,所以直接返回前驅(qū)后面的那個(gè)節(jié)點(diǎn)即可,此處引用為head     return head     # write your code here 

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 门源| 尼玛县| 通城县| 浦江县| 浠水县| 宁海县| 台山市| 德格县| 阿克陶县| 井陉县| 池州市| 綦江县| 通渭县| 枣阳市| 平阳县| 高唐县| 闸北区| 罗山县| 华坪县| 安福县| 探索| 张北县| 凤阳县| 宕昌县| 吉木乃县| 溧阳市| 英德市| 卢龙县| 昌图县| 淳安县| 石家庄市| 广水市| 加查县| 左贡县| 五常市| 丹棱县| 册亨县| 富蕴县| 潜山县| 昌乐县| 昌乐县|