题解 | #删除链表的倒数第n个节点#

删除链表的倒数第n个节点

https://www.nowcoder.com/practice/f95dcdafbde44b22a6d741baf71653f6

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param head ListNode类 
# @param n int整型 
# @return ListNode类
#

方法一

获取链表长度。

  • 时间复杂度为O(N);
  • 空间复杂度为O(1)。

class Solution:
    def removeNthFromEnd(self , head: ListNode, n: int) -> ListNode:
        length = 0
        p = head

		# 获取长度
        while p:
            length += 1
            p = p.next

        res = ListNode(-1) # 便于删除第一个元素
        res.next = head
        pre = res
		cur = head
		
        for i in range(length-n):
            pre = cur
            cur = cur.next
        
        pre.next = cur.next # 删除元素
        return res.next

方法二

快慢指针。快指针先走n步,再快慢指针同时走,并且加一个前序指针指向慢指针的前一个节点。当快指针到了尾端的时候,此时慢指针到了目标节点,则将前序节点的next指向slow节点的next值。

  • 时间复杂度为O(N);
  • 空间复杂度为O(1)。

class Solution:
    def removeNthFromEnd(self , head: ListNode, n: int) -> ListNode:
        slow = head
        fast = head

        res = ListNode(-1)
        res.next = head

        for i in range(n):
            fast = fast.next
        
        pre = res
        while fast:
            pre = slow
            fast = fast.next
            slow = slow.next
        pre.next = slow.next
        return res.next
        

全部评论

相关推荐

七牛云头号黑子:人家是过度包装被看出来没过简历,你是包都不包啊兄弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务