美文网首页
删除链表的倒数第N个节点

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

作者: CoeusZ | 来源:发表于2019-03-01 15:22 被阅读0次

题目

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

示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

解题思路

我的思路 答案(一)
因为遍历一次,但是直到走到最后一步,不然就不知道倒数第n在哪个位置,因此就打算用一个字典,记录每一步的节点,当遍历完成以后就知道倒数n在哪里了,然后就可以在字典中找出来。当然,这样占用了O(n)的空间复杂度就高了。

别人思路 答案(二)
双指针法,求倒数问题的时候,用一个指针先往前移动n步,然后两个指针再一起往前移动直到第一个指针无法继续前进的时候,第二个指针就正好到了倒数n。(非常妙的做法!这样一来,就用只占用O(1)的空间复杂度了)

然后再利用亚节点,这样可以在遍历链表的时候,不用额外进行一些多余的判断,当然这个是因为遍历链表结构的方法造成的。遍历链表的终止条件是当前节点的下一个节点是否是None,但是这样一来,最后一个节点就无法进入遍历了,因为他的下一个节点是None,但是它本身不是None!因此设置哑节点就可以解决这个问题。

答案(一)

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        c_dict = {}
        r = head
        index = 0
        while True:
            index += 1
            c_dict[index] = r
            if r.next is not None:
                r = r.next
            else:
                break
        if n == 1:
            if index == 1:
                return None
            else:
                c_dict[index - 1].next = None
                return head
        elif n == index:
            return head.next
        else:
            c_dict[index - n].next = c_dict[index - n + 2]
            return head

答案(二)

class Solution:
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
        dummy = ListNode(0)
        dummy.next = head
        fast = dummy
        slow = dummy
        for i in range(n):
            fast = fast.next
        
        while fast.next != None:
            fast = fast.next    
            slow = slow.next
            
        slow.next = slow.next.next
        return dummy.next

相关文章

网友评论

      本文标题:删除链表的倒数第N个节点

      本文链接:https://www.haomeiwen.com/subject/bemduqtx.html