链表练习——删除链表的倒数第N个节点
链表
链表在内存中存储是任意摆放的,不像数组一样,需要划出一片区域来进行存储。链表的存储可以形象地表示为下图中描述的样子。链表中各个节点依靠指针来联系,如下图中的箭头所示。
如果要在链表中删除一个节点,可以表示为打断被删除节点所连接的两个箭头,然后将这两个箭头连接起来,如下图所示。
与链表不同,数组如果想要删除一个节点,需要将删除的节点的所有后续节点全部向前移一位,这样做的话,计算开销要比链表多出许多。
Leetcode删除链表的倒数第N个节点
问题描述:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
输入:1->2->3->4->5,n=2
输出:1->2->3->5
思考:
(1)假如n比链表的长度要大,即要求删除的节点并不存在于链表中
(2)假如n等于链表的长度,即要求删除的节点是链表的第一个节点
(3)假如n小于链表长度,即要求删除的节点是链表中的一个普通节点
解决方法:
#定义链表的节点结构
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
countnode = head
current = head
previous = ListNode(0)
previous_copy = previous
count = 1
#首先遍历链表,统计出链表的节点数
while countnode.next != None:
count = count + 1
countnode = countnode.next
#解决第一个问题
#假如要删除的节点并不存在于链表中,那就返回current
if count < n:
return current
#解决第二个问题
#假如要删除的节点是链表的第一个节点,那就返回这条链表中除第一个节点外的全部节点
if count == n:
return current.next
#解决第三个问题
#假如要删除一个链表中的一个普通节点,那么需要两个链表结构,current和previous
#current遍历需要进行节点删除的链表,previous紧随其后
#当current遍历到需要删除的节点时,previous的next直接跳过current所在的节点
#previous的next直接指向current的下一个节点
if count > n:
while count != n:
count = count - 1
previous_copy.next = current
current = current.next
previous_copy = previous_copy.next
previous_copy.next = current.next
return previous.next