LeetCode刷题日记
删除链表的倒数第N个节点
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
Python代码
初学数据结构,链表的题也是终于能做了,这道题目我想的是先计算出整个链表长度,然后减去给定的n再加1,就可以得到正向链表的位置了,例如1->2->3->4->5, 和 n = 2
,我们计算出链表长度为5
,所以就能得到正数第4
个为要删除的数据,因为5-2+1=4
,应该是比较常规的转换方法了。贴代码:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
l = head # 初始化
pre = head # 初始化
def size(li): # 计算链表长度
li = head
i =0
while li:
li = li.next
i+=1
return i
ans = size(l) - n + 1 # 计算正向位置
if ans == 1: # 如果删除的是头结点
head = l.next
index = 1 # 普适情况
while index < ans: # 找到第ans位置的元素
pre = l
index += 1
l = l.next
pre.next = l.next # 把要删除的元素跳过去
l = head
return l
执行用时 : 36 ms, 在Remove Nth Node From End of List的Python提交中击败了12.60% 的用户
内存消耗 : 12 MB, 在Remove Nth Node From End of List的Python提交中击败了0.91% 的用户
下面是在评论区发现的比较好的代码。下面把代码引用过来(点超链接就能直达代码出处,尊重原创)
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def removeNthFromEnd(self, head, n):
p1 = p2 = head
for i in range(n):
if p2.next != None:
p2 = p2.next
else:
return head.next
while p2.next != None:
p1 = p1.next
p2 = p2.next
t = p1.next
p1.next = t.next
return head
执行用时 : 48 ms, 在Remove Nth Node From End of List的Python提交中击败了1.99% 的用户
内存消耗 : 11.9 MB, 在Remove Nth Node From End of List的Python提交中击败了0.91% 的用户
进阶回更。。。未完待续。。。