Python數(shù)據(jù)結構-鏈表Ⅱ(Linked List)

328. 奇偶鏈表

給定一個單鏈表熄浓,把所有的奇數(shù)節(jié)點和偶數(shù)節(jié)點分別排在一起舅踪。請注意界阁,這里的奇數(shù)節(jié)點和偶數(shù)節(jié)點指的是節(jié)點編號的奇偶性萍倡,而不是節(jié)點的值的奇偶性楼咳。
請嘗試使用原地算法完成食寡。你的算法的空間復雜度應為 O(1)雾狈,時間復雜度應為 O(nodes),nodes 為節(jié)點總數(shù)抵皱。

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

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def oddEvenList(self, head: ListNode) -> ListNode:
        # 邊界條件判定
        if not head or not head.next or not head.next.next:
            return head
        # 奇數(shù)頭節(jié)點
        jishu = head
        isjishu = True          # 標記奇數(shù)位
        # 先保存偶數(shù)頭節(jié)點
        oushu0 = head.next
        # 偶數(shù)頭節(jié)點
        oushu = head.next
        cur = head.next.next

        while cur:
            # 先把相鄰的奇數(shù)位善榛、偶數(shù)位鏈表挑選出來
            if isjishu:
                jishu.next = cur
                jishu = cur
            else:
                oushu.next = cur
                oushu = cur
                # 用于判斷奇數(shù)位是否結束
            isjishu = not isjishu
            cur = cur.next
        # 最后將奇數(shù)位鏈表的最后一個節(jié)點與偶數(shù)位鏈表的頭節(jié)點相連
        jishu.next = oushu0
        # 偶數(shù)位鏈表最后一位與空相連
        oushu.next = None
        return head
234. 回文鏈表

輸入:head = [1,2,2,1]
輸出:true

class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
        # 輔助數(shù)據(jù)按順序存儲鏈表元素
        items = []
        cur = head
        while cur:
            items.append(cur.val)
            cur = cur.next
        return items == items[::-1]
61. 旋轉(zhuǎn)鏈表

輸入:head = [1,2,3,4,5], k = 2
輸出:[4,5,1,2,3]
解釋:[1,2,3,4,5]==>[5,1,2,3,4]==>[4,5,1,2,3]

class Solution:
    def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        if not head or not head.next or k == 0:
            return head
        # 把尾部的k個節(jié)點放在最前面
        # 鏈表長度
        count = 1
        cur  = head
        while cur.next:
            count += 1
            cur = cur.next
        # 反向鏈接
        cur.next = head
        # 旋轉(zhuǎn)次數(shù),前t個鏈表移動到后面
        t = count - k % count
        while t > 0:
            cur = cur.next
            t -= 1
        # 新的頭節(jié)點
        newhead = cur.next
        # 斷開節(jié)點
        cur.next = None
        return newhead
19. 刪除鏈表的倒數(shù)第 N 個結點

輸入:head = [1,2,3,4,5], n = 2
輸出:[1,2,3,5]

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        # 雙指針
        dummy = ListNode(0,head)     # 啞結點
        slow = dummy
        fast = head
        for i in range(n):           # slow和fast中間相隔兩個 n 個結點
            fast = fast.next
        
        while fast is not None:      # 當fast到達末尾,slow所指的下一個節(jié)點將被刪除
            slow = slow.next
            fast = fast.next
        
        # 刪除節(jié)點元素
        slow.next = slow.next.next   
        return dummy.next
876. 鏈表的中間結點

給定一個頭結點為 head 的非空單鏈表呻畸,返回鏈表的中間結點移盆。
如果有兩個中間結點,則返回第二個中間結點伤为。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

# 使用快慢指針
class Solution:
    def middleNode(self, head: ListNode) -> ListNode:
        slow = head
        fast = head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
        return slow


# 1 使用輔助數(shù)組
class Solution:
    def middleNode(self, head: ListNode) -> ListNode:
        l = [head]
        while l[-1].next:
            l.append(l[-1].next)
        return l[len(l)//2]

# 2 先獲取鏈表的長度n咒循,之后遍歷到 n//2為止
class Solution:
    def middleNode(self, head: ListNode) -> ListNode:
        n = 0
        tmpnode = head
        while tmpnode:
            tmpnode = tmpnode.next
            n += 1
        i = 0
        cur = head
        while i < n//2:
            cur = cur.next
            i += 1
        return cur
141. 環(huán)形鏈表

給你一個鏈表的頭節(jié)點 head ,判斷鏈表中是否有環(huán)绞愚。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

# 方法1:使用一個哈希表
# 思路:使用一個哈希表來存儲所有已經(jīng)訪問過的節(jié)點叙甸,如果該節(jié)點存在于哈希表中,則說明該鏈表是環(huán)形鏈表

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        seen = set()
        while head:
            if head in seen:
                return True
            seen.add(head)
            head = head.next
        return False

# # 方法2:快慢指針
# # 思路:快指針每次移動一步位衩,慢指針每次移動兩步裆蒸,如果快指針追上慢指針,則為環(huán)形鏈表
class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        # 邊界條件
        if head == None or head.next == None:
            return False

        # 快慢指針
        slow = head
        fast = head.next
        
        while slow != fast:
            if fast == None or fast.next == None:
                return False
            slow = slow.next         # 每次走一步
            fast = fast.next.next    # 每次走兩步
        return True
21. 合并兩個有序鏈表

輸入:l1 = [1,2,4], l2 = [1,3,4]
輸出:[1,1,2,3,4,4]

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        prevHead = ListNode(-1)
        prev = prevHead
        while l1 and l2:
            if l1.val <= l2.val:
                prev.next = l1
                l1 = l1.next
            else:
                prev.next = l2
                l2 = l2.next
            prev = prev.next
        if l1 is not None:
            prev.next = l1
        else:
            prev.next = l2
        return prevHead.next
142. 環(huán)形鏈表 II

輸入:head = [3,2,0,-4], pos = 1
輸出:返回索引為 1 的鏈表節(jié)點
解釋:鏈表中有一個環(huán)糖驴,其尾部連接到第二個節(jié)點僚祷。

class Solution:
    def detectCycle(self, head: ListNode) -> ListNode:
        slow = head
        fast = head
        while True:
            if fast == None or fast.next == None:
                return None
            slow = slow.next
            fast = fast.next.next
            if slow == fast:
                break
        ans = head
        while ans != slow:
            ans = ans.next
            slow = slow.next
        return ans
160. 相交鏈表

輸入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
輸出:Intersected at '8'

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        # 思路:采用雙指針,分別指向兩鏈表的頭節(jié)點
        # 指針A先遍歷完鏈表headA,再開始遍歷headB
        # 指針B先遍歷完鏈表headB,再開始遍歷headA
        A, B = headA, headB
        while A != B:
            A = A.next if A else headB
            B = B.next if B else headA
        return A
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贮缕,一起剝皮案震驚了整個濱河市久妆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌跷睦,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肋演,死亡現(xiàn)場離奇詭異抑诸,居然都是意外死亡烂琴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門蜕乡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奸绷,“玉大人,你說我怎么就攤上這事层玲『抛恚” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵辛块,是天一觀的道長畔派。 經(jīng)常有香客問我,道長润绵,這世上最難降的妖魔是什么线椰? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮尘盼,結果婚禮上憨愉,老公的妹妹穿的比我還像新娘。我一直安慰自己卿捎,他們只是感情好配紫,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著午阵,像睡著了一般躺孝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上趟庄,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天括细,我揣著相機與錄音,去河邊找鬼戚啥。 笑死奋单,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的猫十。 我是一名探鬼主播览濒,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拖云!你這毒婦竟也來了贷笛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤宙项,失蹤者是張志新(化名)和其女友劉穎乏苦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡汇荐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年洞就,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掀淘。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡旬蟋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出革娄,到底是詐尸還是另有隱情倾贰,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布拦惋,位于F島的核電站匆浙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏架忌。R本人自食惡果不足惜吞彤,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叹放。 院中可真熱鬧饰恕,春花似錦、人聲如沸井仰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俱恶。三九已至雹嗦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間合是,已是汗流浹背了罪。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留聪全,地道東北人泊藕。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像难礼,于是被迫代替她去往敵國和親娃圆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容