不断地积累,才能使你与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。
天下第一!强到没边!