【劍指offer】鏈表題目集合

從尾到頭打印鏈表

class Solution:
    # 返回從尾部到頭部的列表值序列,例如[1,2,3]
    def printListFromTailToHead(self, listNode):
        rs = []
        if not ListNode:return rs
        while listNode:
            rs.append(listNode.val)
            listNode = listNode.next
        return rs[::-1]

刪除鏈表中重複節點

# -*- coding:utf-8 -*-
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
class Solution:
    def deleteDuplication(self, pHead):
        # write code here
        if not pHead:return pHead
        dummy = ListNode(-1)
        dummy.next = pHead
        p = dummy
        while p.next:
            # 原來錯誤是while dummy.next:
            # dummy在while中都沒有發生改變,起不到循環結束的作用
            q = p.next
            while (q and p.next.val == q.val):
                q = q.next
            # 如果不存在重複,長度==1
            if p.next.next == q:
                p = p.next
            # 如果存在重複,長度>1
            else: p.next = q
        return dummy.next

反轉鏈表

class Solution:
    def ReverseList(self, pHead):
        # 反轉鏈表需要三個listnode
        pre = None
        cur = pHead
        while cur:
            tail = cur.next
            cur.next = pre
            pre = cur
            cur = tail
        # return cur # cur目前指的是空
        return pre

兩個鏈表出現的第一個公共節點(考)

class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        if not pHead1:return pHead1
        if not pHead2:return pHead2
        len1 = self.getLength(pHead1)
        len2 = self.getLength(pHead2)
        diff = abs(len1-len2)
        p1 = pHead1
        p2 = pHead2
        if len1>len2:
            while diff>0:
                diff -= 1
                p1= p1.next
        if len1<len2:
            while diff>0:
                diff -= 1
                p2 = p2.next
        # print(p1.val)
        # print(p2.val)
        while p1 != p2:
            p1 = p1.next
            p2 = p2.next
        return p1

    def getLength(self,head):
        cnt = 0
        cur = head
        while cur:
            cnt+=1
            cur = cur.next
        return cnt

合併兩個鏈表

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
class Solution:
    # 返回合併後列表
    def Merge(self, pHead1, pHead2):
        # write code here
        p1,p2 = None,None
        rs = None
        head = rs
        while pHead1 and pHead2:
            if pHead1.val < pHead2.val:
                rs.next = pHead1
                pHead1 = pHead1.next
            else:
                rs.next = pHead2
                pHead2 = pHead2
            rs = rs.next
        while pHead1:
            rs.next = pHead1
        while pHead2:
            rs.next = pHead2
        return head

複雜鏈表的複製

class Solution:
    # 返回 RandomListNode
    def Clone(self, pHead):
        if not pHead:return None
        p = pHead
        # 完成節點複製
        while p:
            node = RandomListNode(p.label)
            tail = p.next
            p.next = node
            node.next=tail
            p = tail
        # 複製隨機指針
        q = pHead
        while q:
            if q.random:
                q.next.random = q.random.next
            q = q.next
        # 開始連接複製的節點
        cloNode = pHead
        pHead = pHead.next
        while cloNode.next:
            node = cloNode.next
            cloNode.next = node.next
            cloNode = node
        return pHead

鏈表中倒數第k個節點 

class Solution:
    def FindKthToTail(self, head, k):
        # write code here
        if not head:return head
        p = head
        cnt = 0
        while p:
            cnt += 1
            p = p.next
        if k>cnt:return
        n = cnt-k+1
        dummy = ListNode(-1)
        dummy.next = head
        q = dummy
        cnt = 0
        while q.next:
            cnt += 1
            if cnt==n:
                return q.next.val
            q = q.next

鏈表中環入口的位置

class Solution:
    def EntryNodeOfLoop(self, pHead):

        p1 = pHead #slow
        p2 = pHead #fast
        meet = pHead
        flag = 0
        while p2 and p2.next:
            p1 = p1.next
            p2 = p2.next.next
            if p1 == p2:
                flag = 1
                meet = p1
                break
        if not flag:
            return None

        start = pHead
        while meet and start:
            if meet == start:
                return start
            meet = meet.next
            start = start.next
        return None

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章