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
其方法的分类很详尽,分类处理了多种特殊情况。但是,前述方法是通式通法,对各种特殊测试用例,也能顺利通过。
相关文章推荐
- LeetCode题解(python)-19. 删除链表的倒数第N个节点
- [LeetCode-19] Remove Nth Node From End of List(删除链表中倒数第N个节点)
- leetcode19--删除链表中倒数第n个节点
- leetcode19 Remove Nth Node From End of List(删除链表的倒数第N个节点)
- leetcode 19: 删除链表的倒数第N个节点
- 【Leetcode】19. 删除链表的倒数第N个节点
- leetcode-19. Remove Nth Node From End of List(删除链表倒数第N个节点)
- LeetCode 19. 删除链表的倒数第N个节点
- [C++]LeetCode 19: Remove Nth Node From End of List(删除链表中倒数第n个节点)
- leetcode19删除链表的倒数第N个节点(C语言版)
- leetcode 19 删除链表的倒数第N个节点(快慢指针)
- 【LeetCode题解】19_删除链表的倒数第N个节点(Remove-Nth-Node-From-End-of-List)
- [Leetcode] 19. 删除链表的倒数第N个节点 java
- [LeetCode] 19. Remove Nth Node From End of List 删除链表的倒数第N个节点 @python
- Leetcode做题日记:19. 删除链表的倒数第N个节点(PYTHON)
- leetcode_[python/C++]_19. Remove Nth Node From End of List(删除链表末第n个节点)
- LeetCode 19. Remove Nth Node From End of List--删除链表的倒数第n个结点
- LeetCodet题解--19. Remove Nth Node From End of List(删除链表的倒数第n个元素)
- [LeetCode]—Remove Nth Node From End of List 删除链表的倒数第n个节点
- 【LeetCode】Remove Nth Node From End of List 删除链表中倒数第n个节点- Easy +