劍指offer 面試18題
阿新 • • 發佈:2018-06-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題