给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
思路:
这题做出了不难,难的是要只扫描一遍就做出了。方法是双指针,一个快指针,一个慢指针,初始化这两个指针使得他们距离为n,然后开始往后遍历,当快指针到达链表末端的时候,慢指针刚好在倒数第n-1个位置上,我们就可以操作了。在for循环n次,让fast往后挪n个位子,就可以让slow和fast的距离为n。
这里分两种情况讨论:
1)n = 链表长度,也就是删除第一个结点,那么for循环之后,fast.next为空,此时返回head.next即可。
2)n 不等于 链表长度。先让fast遍历到末端,slow刚好在倒数第 n-1 个位子上,修改一下slow即可。
代码:
class Solution(object):
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
fast = slow = head
for i in range(n):
fast = fast.next
if not fast:
return head.next
while fast.next:
fast = fast.next
slow = slow.next
print fast.val,slow.val
slow.next = slow.next.next
return head