python练习——链表2

链表练习——删除链表的倒数第N个节点

    • 链表
    • Leetcode删除链表的倒数第N个节点

链表

链表在内存中存储是任意摆放的,不像数组一样,需要划出一片区域来进行存储。链表的存储可以形象地表示为下图中描述的样子。链表中各个节点依靠指针来联系,如下图中的箭头所示。
python练习——链表2_第1张图片
如果要在链表中删除一个节点,可以表示为打断被删除节点所连接的两个箭头,然后将这两个箭头连接起来,如下图所示。
python练习——链表2_第2张图片
与链表不同,数组如果想要删除一个节点,需要将删除的节点的所有后续节点全部向前移一位,这样做的话,计算开销要比链表多出许多。

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

你可能感兴趣的:(leetcode,python3笔记)