python算法-017只給定鏈表中某一個節(jié)點的指針的情況下刪除該節(jié)點

不斷地積累,才能使你與offer的差距越來越??!——DKider

此時此刻,電腦上正運行著爬蟲,爬豆瓣電影的那個。。。。。過程還是挺曲折的


題目:給定一個鏈表中的某一個節(jié)點的情況下,刪除該節(jié)點。
例如:Head->1->2->3->4->5->7->7->8
給定一個指向節(jié)點5的cur指針,并在不使用新節(jié)點的情況下刪除它。


刪除節(jié)點,這是增刪改查中的第二個功能,可以看出,這個功能很重要!
在前面我們已經(jīng)學(xué)過了如何刪除節(jié)點了,這里講過——(http://www.itdecent.cn/p/64d9bc63142a

pre.next=cur.next # 這一句就可以刪除cur節(jié)點
cur=pre.next # 遍歷下一個節(jié)點

當然為了更好理解,也可以加一個Next指針指向當前節(jié)點的后繼節(jié)點:

pre.next=Next # 這就非常直觀了
cur=Next # 遍歷下一個節(jié)點

還有,你也可以這么寫:

pre.next=pre.next.next # 
cur=pre.next # 遍歷下一個節(jié)點

以上三種都是一個意思,都可以刪除當前節(jié)點cur,第二種要多用一個空間來保存Next。

可以看出以上三種方法,都需要一個指向當前節(jié)點的pre節(jié)點來講當前節(jié)點刪除。根據(jù)昨天和前天的內(nèi)容,我們可以總結(jié)出,要改變鏈表,有兩個方向——改變data域和改變next域,顯然上面的三種方法都是改變next域的方法。
本題只給定了指向要刪除節(jié)點的指針,無法得到其前驅(qū)節(jié)點,所以這三種方法不行。只給當前節(jié)點的話,只能刪除當前節(jié)點的后繼節(jié)點,也就是說:我們只能刪除后繼節(jié)點,同時還不能讓后繼節(jié)點的數(shù)據(jù)消失,還要將當前節(jié)點的值刪除。因此,我們只要交換前后兩個節(jié)點的值,然后刪除后繼節(jié)點,就完成了。如何交換我前天也講了。

說的形象一點,就是當前節(jié)點要消失,假裝成后繼節(jié)點,把后繼節(jié)點干掉!那就只能把當前節(jié)點的值改成后繼節(jié)點的值,假裝成后繼節(jié)點,然后把真的后繼節(jié)點刪掉!

說的很清楚了,實現(xiàn)如下:

cur.data=cur.next.data
cur.next=cur.next.next

這種方法有一個缺點,就是沒法刪除最后一個節(jié)點。所以在面試遇到時,一定要問清楚。
代碼太簡單,我就不解釋了:

import random
class LNode:
    def __init__(self,arg):
        self.data=arg
        self.next=None

"""
題目描述:
給Head->1->2->2->4->5->5->6
                 ^
                 |
                 p  
只給定p指針刪除節(jié)點

要求:
方法:

"""
def creatLink(x):
    i = 1
    head = LNode(None)
    tmp = None
    cur = head
    while i <= x:
        n=random.randint(1,9)
        tmp = LNode(n)
        cur.next = tmp
        cur = tmp
        i += 1
    return head

def DelNode(head,p):
    if head is None or head.next is None or head.next.next is None:
        return head
    p.data=p.next.data
    p.next=p.next.next
    return head
if __name__ == '__main__':
    head=creatLink(10)
    p=head.next.next.next.next.next
    print("BeforeReverse:")
    cur = head.next
    while cur != None:
        print(cur.data)
        cur = cur.next

    print("p->",p.data)
    head=DelNode(head,p)
    print("\nAfterReverse:")
    cur = head.next
    while cur != None:
        print(cur.data)
        cur = cur.next

還有今天的爬蟲上我用了數(shù)據(jù)庫,是學(xué)Java的室友XHH教我如何安裝MYSQL的,也是他教我如何連接數(shù)據(jù)庫,感謝!

一個注意點:

try:...
except:
finally:

這個錯誤處理結(jié)構(gòu),一定要在確定代碼運行后,不會丟失大量數(shù)據(jù),不會丟失重要數(shù)據(jù),在調(diào)試階段不要用。而且最好在except后指明確定的錯誤類型,不然在找bug時,會讓你砸了電腦。

目前需要學(xué)的東西太多了,雖然基礎(chǔ)部分學(xué)校老師講了,但是深度還不夠,而且由于課時安排的原因,很多課并沒有講完,就像今天室友電話面試,被問到學(xué)校里計算機網(wǎng)絡(luò)的目錄是啥?這。。對于我們學(xué)校以及學(xué)院以及我們本身來說,能答上來的屈指可數(shù)。

我們一定要打好堅實的基礎(chǔ)!才能超越別人,拿下offer。

天下第一!強到?jīng)]邊!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容