Leetcode–删除链表中的节点
删除链表中的节点,包括leetcode19和leetcode237
编程语言:python
作者:黑暗主宰
邮箱:shengzhanhe@gmail.com
Leetcode-删除链表中的节点
题目描述
原题链接:
题目描述:
这里题目描述,只把这两个题的题干写出来,具体的,小伙伴们点开链接就可以查看。
237.删除链表中的节点: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。 |
---|
19.删除链表的倒数第N个节点: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 |
---|
解题思路
237.删除链表中的节点
一个链表,它不想数组那样可以索引我们指定的元素,所以我们删除链表中节点的方法,一个是修改之前的节点,二是与下一个节点做交换。,如下图所示,是这个两种方法的区别,红色表示要断开的链接,蓝色表示重新指向的地址。
在leetcode这个删除链表中节点的题目中,我们只知道当前节点,不知道前一个节点,所以我们只能使用第二中方法,代码如下:
class Solution:
def deleteNode(self, node):
"""
:type node: ListNode
:rtype: void Do not return anything, modify node in-place instead.
"""
node.val = node.next.val
node.next = node.next.next
正如代码中看到的,只需要两行。第一步操作是把下一个节点的值赋值给当前节点,第二步就是把指向下一个的地址修改为下下一个就可以啦(看图所示)。
19.删除链表的倒数第N个节点
链表不能索引,所以只能从前往后遍历;很自然的一种想法,我们先遍历一遍链表,可以知道他的长度 length
,然后我们要删除倒数第 N
个,就是从前往后遍历第 length-N
个,然后删除节点就可以啦。按照这样的想法,代码如下
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
if not head:return
new = ListNode(0)
new.next = head
tra = head
cnt = 0
while tra:
cnt += 1
tra = tra.next
k = cnt - n
cur = new
while k:
cur = cur.next
k -= 1
cur.next = cur.next.next
return new.next
上面的方法需要遍历两次,下面提供一种一次遍历的方法,假如我们有两个指针,第一个先走 n
步,然后第二个指针开始走,当第一个走完的时候,第二个指针刚好走到了倒数第 n
个。如下图:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
res = ListNode(0)
res.next = head
fast = res
while n:
fast = fast.next
n -= 1
slow = res
while fast and fast.next:
slow = slow.next
fast = fast.next
slow.next = slow.next.next
return res.next
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
注: 文中有写错的地方,欢迎大家不吝指正!!!