python算法-017只给定链表中某一个节点的指针的情况下删除该节点

不断地积累,才能使你与offer的差距越来越小!——DKider

此时此刻,电脑上正运行着爬虫,爬豆瓣电影的那个。。。。。过程还是挺曲折的


题目:给定一个链表中的某一个节点的情况下,删除该节点。
例如:Head->1->2->3->4->5->7->7->8
给定一个指向节点5的cur指针,并在不使用新节点的情况下删除它。


删除节点,这是增删改查中的第二个功能,可以看出,这个功能很重要!
在前面我们已经学过了如何删除节点了,这里讲过——(https://www.jianshu.com/p/64d9bc63142a)

pre.next=cur.next # 这一句就可以删除cur节点
cur=pre.next # 遍历下一个节点

当然为了更好理解,也可以加一个Next指针指向当前节点的后继节点:

pre.next=Next # 这就非常直观了
cur=Next # 遍历下一个节点

还有,你也可以这么写:

pre.next=pre.next.next # 
cur=pre.next # 遍历下一个节点

以上三种都是一个意思,都可以删除当前节点cur,第二种要多用一个空间来保存Next。

可以看出以上三种方法,都需要一个指向当前节点的pre节点来讲当前节点删除。根据昨天和前天的内容,我们可以总结出,要改变链表,有两个方向——改变data域和改变next域,显然上面的三种方法都是改变next域的方法。
本题只给定了指向要删除节点的指针,无法得到其前驱节点,所以这三种方法不行。只给当前节点的话,只能删除当前节点的后继节点,也就是说:我们只能删除后继节点,同时还不能让后继节点的数据消失,还要将当前节点的值删除。因此,我们只要交换前后两个节点的值,然后删除后继节点,就完成了。如何交换我前天也讲了。

说的形象一点,就是当前节点要消失,假装成后继节点,把后继节点干掉!那就只能把当前节点的值改成后继节点的值,假装成后继节点,然后把真的后继节点删掉!

说的很清楚了,实现如下:

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

这种方法有一个缺点,就是没法删除最后一个节点。所以在面试遇到时,一定要问清楚。
代码太简单,我就不解释了:

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

"""
题目描述:
给Head->1->2->2->4->5->5->6
                 ^
                 |
                 p  
只给定p指针删除节点

要求:
方法:

"""
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

还有今天的爬虫上我用了数据库,是学Java的室友XHH教我如何安装MYSQL的,也是他教我如何连接数据库,感谢!

一个注意点:

try:...
except:
finally:

这个错误处理结构,一定要在确定代码运行后,不会丢失大量数据,不会丢失重要数据,在调试阶段不要用。而且最好在except后指明确定的错误类型,不然在找bug时,会让你砸了电脑。

目前需要学的东西太多了,虽然基础部分学校老师讲了,但是深度还不够,而且由于课时安排的原因,很多课并没有讲完,就像今天室友电话面试,被问到学校里计算机网络的目录是啥?这。。对于我们学校以及学院以及我们本身来说,能答上来的屈指可数。

我们一定要打好坚实的基础!才能超越别人,拿下offer。

天下第一!强到没边!

你可能感兴趣的:(python算法-017只给定链表中某一个节点的指针的情况下删除该节点)