劍指offer 面試18題


面試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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM