题目:
Given a linked list, remove the nth node from the end of list and return its head.
For example,
Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
Given n will always be valid.
Try to do this in one pass.
题意:
给定一个单链表和整数n,删除单链表中的倒数第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 = q = head #通过双指针p和q确定距离n,当p指到空时,q指的就是倒数第n个节点
for i in range(n): #使p,q的距离为n
q = q.next
if q == None : #考虑特殊情况,如果链表总长度是n,要删除倒数第n个,即删除头结点,则需要修改head
return head.next
while q.next != None : #否则,head不需要修改,通过修改p的指向直接删除倒数第n个节点
p = p.next
q = q.next
p.next = p.next.next
return head
笔记:
1、双指针的思想,通过双指针保持距离n,找到倒数第n个节点
2、考虑n的特殊情况,当n=0,n=1,n=链表长度 等不同情况时,该如何处理。
3、考虑head是否需要修改。