这就是鼎鼎大名2017年西安交通大学软件工程专业研究生入学考试820的一道题,当年我还是傻傻的遍历两次的程度,虽然现在也没有好很多,但是至少明白应该用两个指针,哈哈。
思路
只允许一遍遍历的话,常规思路就失效了,我们此时往往需要用到双指针,pre和cur指针。首先cur指针先向前走N步,如果此时cur指向空,说明N为链表的长度,则需要移除的为首元素,那么此时我们返回head->next即可,如果cur存在,我们再继续往下走,此时pre指针也跟着走,直到cur为最后一个元素时停止,此时pre指向要移除元素的前一个元素,我们再修改指针跳过需要移除的元素即可。
代码
# 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
"""
dummy = ListNode(0)
dummy.next = head
pre = cur = dummy
for i in range(n):
cur = cur.next
while cur.next:
cur = cur.next
pre = pre.next
pre.next = pre.next.next
return dummy.next
运行结果
208 / 208 test cases passed.
Status: Accepted
Runtime: 40 ms