本题是比较基础的链表题。
1.思路
1)单次遍历
2)双指针
Note:两次遍历的方法只需要一个指针,空间换时间,因此单次遍历不可避免使用双指针
首先,双指针指向头指针,rear向后移动n次。
如果此时指针已经指向None【边界情况】,意思就是第一个元素是需要被删除的,返回head.next。
如果此时指针不指向None,则head和rear都向后移动,直到rear.next是None,此时删除head的下一个节点即可。
技术难点:
1)给几个指针
2)rear后移并且边界检查
3)同时后移,直至结束条件
4)删除选定节点
2.代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
result = head
rear = head
for i in range(n):
rear = rear.next
if rear == None:
return head.next
while(rear.next):
head = head.next
rear = rear.next
tmp = head.next
head.next = tmp.next
del tmp
return result