鏈表 LC.19/83/92/61/143/21/160/141/147/138/142

LC.19 Remove Nth Node Form End of List

Description

Given a linked list, remove the n-th node from the end of list and return its head.

Example:

Given linked list: 1->2->3->4->5, and n = 2.

After removing the second node from the end, the linked list becomes 1->2->3->5.

Note:

Given n will always be valid.

Follow up:

Could you do this in one pass?

Solution

  • one-pass (trivial) 實(shí)際上有兩個(gè)指針肠缨,所以是2-pass
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        count = 1
        target = head
        temp = head
        while count < n:
            temp = temp.next
            count += 1
        if temp.next == None:
            return target.next
        else:
            temp = temp.next
        while temp.next != None:
            target = target.next
            temp = temp.next
        target_d = target.next
        target.next = target_d.next
        
        return head
        
  • recursive

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
            rec = self.helper(head, n)
            if rec == n:
                return head.next
            return head
        
        def helper(self, head: ListNode, n: int) -> int:
            if head.next == None:
                return 1
            rec = self.helper(head.next, n)
            if rec == n:
                head.next = head.next.next
            return rec + 1
    

    遞歸做法榄笙,實(shí)際上這道題本質(zhì)上必須遍歷整個(gè)鏈表直到最后一個(gè)node揍移,所以用遞歸的方法查看之后還剩多少個(gè)元素盯桦,如果正好是n的話驻仅,那么當(dāng)前的結(jié)點(diǎn)(倒數(shù)第n+1個(gè))的下一個(gè)結(jié)點(diǎn)(倒數(shù)第n個(gè))就需要被刪除其徙。和另外一個(gè)方法比起來并不會(huì)增大memory的占用唯灵。runtime還更低(我猜是因?yàn)樯倭艘粋€(gè)移動(dòng)的指針)


LC.83 Remove Duplicates from Sorted List

Description

Given a sorted linked list, delete all duplicates such that each element appear only once.

Example 1:

Input: 1->1->2
Output: 1->2

Example 2:

Input: 1->1->2->3->3
Output: 1->2->3

Solution

  • straight solution (兩個(gè)指針)

  • # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def deleteDuplicates(self, head: ListNode) -> ListNode:
            node_a = head
            node_b = head
            if head == None:
                return head
            while node_b.next != None:
                if node_b.val != node_b.next.val:
                    node_a.next = node_b.next
                    node_a = node_a.next
                node_b = node_b.next
            if not node_a == node_b:
                node_a.next = node_b.next
            return head
    

    或者一個(gè)指針:

    class Solution:
        def deleteDuplicates(self, head: ListNode) -> ListNode:
            temp = head
            while temp != None and temp.next != None:
                if temp.val == temp.next.val:
                    temp.next = temp.next.next
                else:
                    temp = temp.next
            return head
    
  • 遞歸做法

    class Solution:
        def deleteDuplicates(self, head: ListNode) -> ListNode:
            if head == None or head.next == None:
                return head
            if head.val == head.next.val:
                return self.deleteDuplicates(head.next)
            else:
                head.next = self.deleteDuplicates(head.next)
                return head
    

LC. 92 Reversed Linked List

Reverse a linked list from position m to n. Do it in one-pass.

Note: 1 ≤ mn ≤ length of list.

Example:

Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL

Solution

  • 直接從前往后走丰泊,只要還在reverse的范圍內(nèi)薯定,看見一個(gè)拎出來一個(gè),添加到旁邊的翻轉(zhuǎn)新鏈表的表頭瞳购。所有需要翻轉(zhuǎn)的都翻轉(zhuǎn)完之后话侄,把新的鏈表插在原來的鏈表里面

    class Solution(object):
        def reverseBetween(self, head, m, n):
            """
            :type head: ListNode
            :type m: int
            :type n: int
            :rtype: ListNode
            """
            holder = ListNode(-1)
            holder.next = head
            head = holder
            count = 1
            while count < m:
                head = head.next
                count += 1
            new = None
            while count < n+1:
                temp = head.next.next
                head.next.next = new
                new = head.next
                if count == m:
                    tail = new
                head.next = temp
                count += 1
            temp = head.next
            head.next = new
            tail.next = temp
            return holder.next
    
    

    在表的最前面加一個(gè)holder可以方便計(jì)數(shù),并且corner case少了很多Q年堆!第17-20行是翻轉(zhuǎn)表頭的操作

  • 遞歸做法

    class Solution(object):
        def reverseBetween(self, head, m, n):
            """
            :type head: ListNode
            :type m: int
            :type n: int
            :rtype: ListNode
            """
            self.successor = None
            if m == 1:
                return self.reverseHelper(head, n-m+1)
            head.next = self.reverseBetween(head.next, m-1, n-1)
            return head
                
        def reverseHelper(self, head, m):
            if m == 1:
                self.successor = head.next
                return head
            new = self.reverseHelper(head.next, m-1)
            head.next.next = head
            head.next = self.successor
            return new
    

    是LC.206的變形,遞歸的時(shí)候加入一個(gè)變量k盏浇,reverse當(dāng)前鏈表的前k個(gè)元素变丧。遞歸現(xiàn)在還寫得亂七八糟的!绢掰!


LC. 61 Rotate List

Given a linked list, rotate the list to the right by k places, where k is non-negative.

Example 1:

Input: 1->2->3->4->5->NULL, k = 2
Output: 4->5->1->2->3->NULL
Explanation:
rotate 1 steps to the right: 5->1->2->3->4->NULL
rotate 2 steps to the right: 4->5->1->2->3->NULL

Example 2:

Input: 0->1->2->NULL, k = 4
Output: 2->0->1->NULL
Explanation:
rotate 1 steps to the right: 2->0->1->NULL
rotate 2 steps to the right: 1->2->0->NULL
rotate 3 steps to the right: 0->1->2->NULL
rotate 4 steps to the right: 2->0->1->NULL

Solution

  • 直接解:

    先數(shù)一下一共有多少個(gè)元素痒蓬,再用總數(shù)減去模k的值求left rotate多少個(gè)。找到新的頭元素滴劲,把tail和原來的頭元素串起來就好了

    class Solution(object):
        def rotateRight(self, head, k):
            """
            :type head: ListNode
            :type k: int
            :rtype: ListNode
            """
            if not head:
                return head
            count = 1
            key = head
            while key.next:
                count += 1
                key = key.next
            key.next = head
            k = count - k % count
            
            while k > 1:
                head = head.next
                k -= 1
            new = head.next
            head.next = None
            return new
    
  • 還可以用間隔k的兩個(gè)指針攻晒,一旦走到頭就重新回到head的方法,不需要顯式地求list的長(zhǎng)度班挖。但這樣復(fù)雜度顯然變高了鲁捏,模掉的那堆都得計(jì)算一遍


LC. 143 Reorder List

Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→LnL1→Ln-1→L2→Ln-2→…

You may not modify the values in the list's nodes, only nodes itself may be changed.

Example 1:

Given 1->2->3->4, reorder it to 1->4->2->3.

Example 2:

Given 1->2->3->4->5, reorder it to 1->5->2->4->3.

Solutions

  • 這題還蠻容易錯(cuò)的,主要是reverse list的時(shí)候不能反轉(zhuǎn)原鏈表萧芙,這樣正序的鏈表就沒了碴萧;首先找到鏈表中點(diǎn)乙嘀,然后反轉(zhuǎn)后一半的鏈表末购,前一半的鏈表a和后一半的反轉(zhuǎn)鏈表b交替插在一塊兒就好了

    class Solution(object):
        def reorderList(self, head):
            """
            :type head: ListNode
            :rtype: None Do not return anything, modify head in-place instead.
            """
            if not head or not head.next:
                return
            a = b = head
            move_a = False
            while b.next:
                b = b.next
                if move_a == True:
                    a = a.next
                    move_a = False
                else:
                    move_a = True
            list_b = self.reverseList(a.next)
            a.next = None
            list_a = head
            while list_b:
                a_temp = list_a.next
                b_temp = list_b.next
                list_a.next = list_b
                list_b.next = a_temp
                list_a = a_temp
                list_b = b_temp
            return
        
        def reverseList(self, head):
            if not head.next:
                return head
            new = self.reverseList(head.next)
            head.next.next = head
            head.next = None
            return new
    

    優(yōu)化:

    第7-17行可以優(yōu)化成如下破喻,復(fù)雜度降了好多,我也不確定為什么盟榴,大概是更改變量的次數(shù)變少了曹质。。

     while b.next.next:
                b = b.next.next
                a = a.next
                if not b.next:
                    break
    
  • 感覺這道沒必要用遞歸擎场,因?yàn)槊看味嫉谜易钗捕说脑赜鸬拢詢r(jià)比很低 (?


LC. 21. Merge Two Sorted Lists

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

Example:

Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4迅办、

Solutions

  • 直接解(超級(jí)丑)

  • class Solution(object):
        def mergeTwoLists(self, l1, l2):
            """
            :type l1: ListNode
            :type l2: ListNode
            :rtype: ListNode
            """
            if not l1:
                return l2
            if not l2:
                return l1
            if l1.val <= l2.val:
                head = l1
                l1 = l1.next
            else:
                head = l2
                l2 = l2.next
            key = head
            while l1 and l2:
                if l1.val <=l2.val:
                    key.next = l1
                    key = key.next
                    l1 = l1.next
                else:
                    key.next = l2
                    key = key.next
                    l2 = l2.next
            if l1 or l2:
                key.next = l1 if l1 else l2
            return head
    
  • 遞歸(似乎叫動(dòng)態(tài)規(guī)劃了這里)

    class Solution(object):
        def mergeTwoLists(self, l1, l2):
            """
            :type l1: ListNode
            :type l2: ListNode
            :rtype: ListNode
            """
            if not l1:
                return l2
            if not l2:
                return l1
            if l1.val <= l2.val:
                l1.next = self.mergeTwoLists(l1.next, l2)
                return l1
            else:
                l2.next = self.mergeTwoLists(l1, l2.next)
                return l2
    

LC. 160. Intersection of Two Linked Lists

Write a program to find the node at which the intersection of two singly linked lists begins.

Notes:

If the two linked lists have no intersection at all, return null.
The linked lists must retain their original structure after the function returns.
You may assume there are no cycles anywhere in the entire linked structure.
Your code should preferably run in O(n) time and use only O(1) memory.

Solutions

  • 一個(gè)超簡(jiǎn)潔的解法:

    class Solution(object):
        def getIntersectionNode(self, headA, headB):
            """
            :type head1, head1: ListNode
            :rtype: ListNode
            """
            if not headA or not headB:
                return None
            
            a = headA
            b = headB
            while a != b:
                a = headB if a == None else a.next
                b = headA if b == None else b.next
            return a
    
    • 思路是a+b = b+a宅静,如果遍歷兩遍,他們會(huì)同時(shí)到達(dá)終點(diǎn)站欺,自動(dòng)對(duì)齊

    • 第12行很重要姨夹,這和兩個(gè)鏈表intersect的方式有關(guān),如果只是一個(gè)node的val相同矾策,這個(gè)語(yǔ)句是false的磷账。必須后面是同一個(gè)鏈才是true

    • 第12行到14行的另外一種錯(cuò)誤寫法:

      if a.next == None:
          a.next = headB
      if b.next == None:
          b.next = headA
      a = a.next
      b = b.next
      

      原因是第2/4行會(huì)導(dǎo)致鏈表的終端不指向None,會(huì)形成一個(gè)環(huán)形鏈表贾虽,這樣后到達(dá)的指針就出不來了逃糟!


LC. 141. Linked List Cycle

Given a linked list, determine if it has a cycle in it.

To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list.

Example 1:

Input: head = [3,2,0,-4], pos = 1
Output: true
Explanation: There is a cycle in the linked list, where tail connects to the second node.

Solutions

  • 一個(gè)作弊解法:(which 我覺得肯定有毛病)

    class Solution(object):
        def hasCycle(self, head):
            """
            :type head: ListNode
            :rtype: bool
            """
            marker = ListNode(-1)
            if not head:
                return False
            while head.next and not head.next == marker:
                temp = head.next
                head.next = marker
                head = temp
            if not head.next:
                return False
            return True
    

    走過的點(diǎn)就標(biāo)記為走過蓬豁,通過把它指向一個(gè)marker點(diǎn)绰咽。但這樣鏈表就被損壞了

  • 龜兔賽跑的解法:一個(gè)指針以步長(zhǎng)1移動(dòng),另一個(gè)以步長(zhǎng)2移動(dòng)地粪。如果有環(huán)的話取募,fast指針一定會(huì)追上另外一個(gè)

    class Solution(object):
        def hasCycle(self, head):
            """
            :type head: ListNode
            :rtype: bool
            """
            try:
                slow = head
                fast = head.next
                while not slow == fast:
                    slow = slow.next
                    fast = fast.next.next
                return True
            except:
                return False
    

    這里用try/except的寫法寫會(huì)更快,不必每次顯式地檢查是否有指針到達(dá)終點(diǎn)

class Solution(object):
def insertionSortList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head:
return head
helper = ListNode(0)
pre = helper

    while head:
        temp = head.next
        if pre.next and head.val < pre.next.val:
            pre = helper
        while pre.next and head.val >= pre.next.val:
            pre = pre.next
        head.next = pre.next
        pre.next = head
        head = temp
        
    return helper.next

LC. 138 Copy List with Random Pointer

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

Solution

  • 交替索引

    class Solution(object):
        def copyRandomList(self, head):
            """
            :type head: Node
            :rtype: Node
            """
            if not head:
                return None
            helper = Node(0, head, None)
            while head.next:
                new = Node(head.val, head.next, head.random)
                head.next = new
                head = head.next.next
            new = Node(head.val, None, head.random)
            head.next = new
            
            new_head = helper.next.next
            while new_head.next:
                new_head.random = None if not new_head.random else new_head.random.next
                new_head = new_head.next.next
            new_head.random = None if not new_head.random else new_head.random.next
                
            head = helper.next
            helper.random = head.next
            new = Node(0, None, None)
            while head.next.next:
                new.next = head.next
                head.next = head.next.next
                new = new.next
                head = head.next
            new.next = head.next
            head.next = None
    
            return helper.random
    
  • keep an hash table for each node in the list: 原鏈表的每一個(gè)node索引到它的copy上驶忌,然后再次從頭到位遍歷原來的鏈表矛辕,寫入新結(jié)點(diǎn)們的next和random

    class Solution(object):
        def copyRandomList(self, head):
            """
            :type head: Node
            :rtype: Node
            """
            if not head:
                return None
            copy = dict()
            m = n = head
            while m:
                copy[m] = Node(m.val, m.next, m.random)
                m = m.next
            while n:
                copy[n].next = copy.get(n.next)
                copy[n].random = copy.get(n.random)
                n = n.next
            return copy[head]
    

    需要注意的是,在第15/16行都用的是dict.get(key)而不是直接dict[key], 這是為了當(dāng)key等于None的時(shí)候付魔,返回default value None而不是報(bào)錯(cuò)聊品。如果事先定義copy[None]=None的話,這兩處也可以直接用dict[key]

    這種方法還有一個(gè)很trick的只遍歷一次的寫法几苍,使用collections.defaultdict來訪問(及創(chuàng)建)存在(或不存在)的結(jié)點(diǎn)

    class Solution(object):
        def copyRandomList(self, head):
            """
            :type head: Node
            :rtype: Node
            """
            copy = collections.defaultdict(lambda: Node(0, None, None))
            m = head
            copy[None] = None
            while m:
                copy[m].val = m.val
                copy[m].next = copy[m.next]
                copy[m].random = copy[m.random]
                m = m.next
            return copy(head)
    

    注意這里的12/13行是直接調(diào)用的方式翻屈,且在第9行定義了key=None的情況。這是因?yàn)楝F(xiàn)在的default是RandomNode(0)而不是None了


LC. 142 Linked List Cycle II

Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list.

Solution

  • hash table that records the visited nodes

    class Solution(object):
        def detectCycle(self, head):
            """
            :type head: ListNode
            :rtype: ListNode
            """
            info = dict()
            m = head
            while m:
                if not info.get(m):
                    info[m] = True
                else:
                    return m
                m = m.next
            return None
    
  • hare-tortoise method

    class Solution(object):
        def detectCycle(self, head):
            """
            :type head: ListNode
            :rtype: ListNode
            """
            fast = slow = helper = head
            try:
                fast = fast.next.next
                slow = slow.next
                while not fast == slow:
                    fast = fast.next.next
                    slow = slow.next
                while not helper == slow:
                    helper = helper.next
                    slow = slow.next
                return helper
            except:
                return None
    

    這里最重要的就是fast步長(zhǎng)=2妻坝,slow=1伸眶。惊窖。。這樣保證了fast恰好超slow一圈

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厘贼,一起剝皮案震驚了整個(gè)濱河市界酒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘴秸,老刑警劉巖毁欣,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異岳掐,居然都是意外死亡凭疮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門串述,熙熙樓的掌柜王于貴愁眉苦臉地迎上來执解,“玉大人,你說我怎么就攤上這事纲酗∷ル纾” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵耕姊,是天一觀的道長(zhǎng)桶唐。 經(jīng)常有香客問我,道長(zhǎng)茉兰,這世上最難降的妖魔是什么尤泽? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮规脸,結(jié)果婚禮上坯约,老公的妹妹穿的比我還像新娘。我一直安慰自己莫鸭,他們只是感情好闹丐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著被因,像睡著了一般卿拴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梨与,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天堕花,我揣著相機(jī)與錄音,去河邊找鬼粥鞋。 笑死缘挽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壕曼,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼苏研,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了腮郊?” 一聲冷哼從身側(cè)響起摹蘑,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伴榔,沒想到半個(gè)月后纹蝴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡踪少,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糠涛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片援奢。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖忍捡,靈堂內(nèi)的尸體忽然破棺而出集漾,到底是詐尸還是另有隱情,我是刑警寧澤砸脊,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布具篇,位于F島的核電站,受9級(jí)特大地震影響凌埂,放射性物質(zhì)發(fā)生泄漏驱显。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一瞳抓、第九天 我趴在偏房一處隱蔽的房頂上張望埃疫。 院中可真熱鬧,春花似錦孩哑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)右核。三九已至,卻和暖如春丛晌,著一層夾襖步出監(jiān)牢的瞬間仅炊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工茵乱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茂洒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像督勺,于是被迫代替她去往敵國(guó)和親渠羞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 什么是數(shù)組智哀? 數(shù)組簡(jiǎn)單來說就是將所有的數(shù)據(jù)排成一排存放在系統(tǒng)分配的一個(gè)內(nèi)存塊上次询,通過使用特定元素的索引作為數(shù)組的下...
    啟明_b56f閱讀 914評(píng)論 0 0
  • <center>#1 Two Sum</center> link Description:Given an arr...
    鐺鐺鐺clark閱讀 2,154評(píng)論 0 3
  • Python語(yǔ)言特性 1 Python的函數(shù)參數(shù)傳遞 看兩個(gè)如下例子,分析運(yùn)行結(jié)果: 代碼一: a = 1 def...
    伊森H閱讀 3,067評(píng)論 0 15
  • 說來很是慚愧瓷叫,這半輩子好像都沒有堅(jiān)持很久的事情屯吊,每一件都是雄心壯志的開始,最后都是不自信或懶惰而半途而廢摹菠,想想真是...
    kitty2017閱讀 155評(píng)論 0 0
  • 如果可以盒卸,我愿是你樹上的葉,在有生命的歲月里次氨,和你緊相依蔽介,把我的色彩寫滿你的枝,我所有的色彩只為你而亮煮寡。 如果可以...
    寧蕤閱讀 305評(píng)論 0 17