您的位置:首页 > 其它

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

2019-02-17 10:12 375 查看
版权声明:版权归博主所有,转载请注明 https://blog.csdn.net/qq_17808707/article/details/87516398

题目描述

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。

解题思路

比较简单的想法是进行两次遍历,第一次遍历确定链表长度,第二次遍历到指定节点前一个节点,进行删除操作。
本题可只进行一次遍历。采用双指针的方法。
首先,设置一个哑结点dummy,其next指针指向head。随后令p1,p2两个指针指向dummy,p2先前进n+1,随后p1和p2同时前进,直到p2指向None。此时即可发现,p1恰好指向要删除的节点的前一个节点,随后执行删除操作即可。

代码

# 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
"""
dummy=ListNode(None)
dummy.next=head
p1=dummy
p2=dummy
for i in range(n+1):
p2=p2.next
while p2!=None:
p2=p2.next
p1=p1.next
del_node=p1.next
p1.next=p1.next.next
del del_nodereturn dummy.next

结果


第二次提交的结果比第一次快,因为加入了

del del_node

语句。推测加入此语句后,python解释器的垃圾回收过程得到了加快,故执行用时减少。

反思

目前执行最快的代码如下:

# 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
"""

'''可以使用类似求倒数第k的节点的方式,使用等距法'''

if head == None:
return None

p1 = head
p2 = head
# 使用try结构,表示如果链表长度不够n,就不用删除,直接返回首节点即可
try:
for i in range(n):
p2=p2.next
except:
return head

# 如果长度恰好等于n,就返回以第二个节点为首节点的链表
if p2==None:
return head.next

# 循环直到p2指向最后一个节点
while p2.next != None:
p1 = p1.next
p2 = p2.next
del_node = p1.next
p1.next = p1.next.next
del del_nodereturn head

其方法的分类很详尽,分类处理了多种特殊情况。但是,前述方法是通式通法,对各种特殊测试用例,也能顺利通过。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: