给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
第一种思路:
链表转list处理再转链表输出。
第二种思路:
一趟扫描获得链表长度l,然后删除从前往后的第l - n +1个节点。
第三种思路:
快慢指针法,快指针先走n步,然后快慢指针一起走,
当快指针是链表尾部的最后一个元素时,
慢指针指向元素的下一个元素就是需要删的那个元素。
# 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
"""
p = head
slow, fast = p, p
while(n):
n -= 1
fast = fast.next
if fast is None:
return p.next
while(fast and fast.next):
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return p