题目分析:
给定链表,从链表末尾删除倒数第n个节点并返回新的头部。由于题目要求遍历一次完成操作所以不可能找到长度在删除。借鉴网上的一种做法,设置两个指针。前面的指针走n个元素,后面的指针再走。这样前面的走到最后时后面的指针刚好指到要删除的前一个元素。
代码说明:
1、前面元素走n次
for i in range(n):
begin = begin.next
2、如果前面指针走完是空了,那么要删除的正是第一个元素
if begin is None: return head.next
3、两个指针一起走,这样前面的走到最后时后面的指针刚好指到要删除的前一个元素。
while(begin.next):
begin = begin.next
end = end.next
4、前面的走到最后时后面的指针刚好指到要删除的前一个元素,所以直接让那个位置跳过一个元素。
end.next = end.next.next
测试代码(非提交代码,提交代码在下面)
def print_ListNode(head):
while (True):
print(head.val)
if head.next is not None:
head = head.next
else:
break
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def removeNthFromEnd(self, head, n):
begin, end = head, head
for i in range(n):
begin = begin.next
if begin is None: return head.next
while(begin.next):
begin = begin.next
end = end.next
end.next = end.next.next
return head
list_node1 = ListNode(1)
list_node2 = ListNode(2)
list_node3 = ListNode(3)
list_node4 = ListNode(4)
list_node5 = ListNode(5)
list_node1.next = list_node2
list_node2.next = list_node3
list_node3.next = list_node4
list_node4.next = list_node5
print_ListNode(Solution().removeNthFromEnd(list_node1, 2))
提交代码
class Solution:
def removeNthFromEnd(self, head, n):
begin, end = head, head
for i in range(n):
begin = begin.next
if begin is None: return head.next
while(begin.next):
begin = begin.next
end = end.next
end.next = end.next.next
return head