1. 程式人生 > >劍指offer 面試18題

劍指offer 面試18題

color 形式 odi append res 節點 保存 單向 round

面試18題:

題目:刪除鏈表中的節點

題一:在O(1)時間內刪除鏈表節點。給定單向鏈表的頭指針和一個節點指針,定義一個函數在O(1)時間內刪除該節點。

解題思路:我們要刪除節點i,先把i的下一個節點j的內容復制到i,然後把i的指針指向節點j的下一個節點。此時再刪除節點j,其效果等同於把節點i刪除了。

解題代碼:

class ListNode:
    def __init__(self):
        self.value = None
        self.next_node = None

class Solution:
    def delete_node(self,head_node,del_node):
        
""" 刪除指定節點 """ if not (head_node and del_node): return False #要刪除的節點不是尾節點 if del_node.next_node: del_next_node=del_node.next_node del_node.value=del_next_node.value del_node.next_node=del_next_node.next_node del_next_node.value
=None del_next_node.next_node=None #鏈表只要一個節點,刪除頭節點(也是尾節點) elif del_node==head_node: head_node=None del_node = None #鏈表中有多個節點,刪除尾節點 else: node=head_node while node.next_node!=del_node: node
=node.next_node node.next_node=None del_node=None return head_node

題目:刪除鏈表中重復的節點。

題:在一個排序的鏈表中,請刪除重復的節點,如1-2-3-3-4-4-5在重復的節點被刪除後為1-2-5。

解題思路一:將鏈表元素保存在列表中,然後過濾掉出現次數大於1的值,只保留出現次數為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
        res=[]
        while pHead:
            res.append(pHead.val)
            pHead=pHead.next
        res=list(filter(lambda c:res.count(c)==1,res))
        
        newList=ListNode(0)
        pre=newList
        for i in res:
            node=ListNode(i)
            pre.next=node
            pre=pre.next
        return newList.next
            

解題思路二:運用鏈表的操作,確保將重復的節點略過,始終連接不重復的值。

解題代碼:

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def deleteDuplication(self, pHead):
        # write code here
        first=ListNode(-1)
        first.next=pHead
        last=first
        
        while pHead and pHead.next:
            if pHead.val == pHead.next.val:
                val=pHead.val
                while pHead and pHead.val==val:
                    pHead=pHead.next
                last.next=pHead
            else:
                last=pHead
                pHead=pHead.next
        return first.next

劍指offer 面試18題