1 题目描述
2 解题思路
2.1 哨兵节点+链表长度
设置一个哨兵节点,然后我们判断链表的长度。
接着我们求出需要被删除的那一个节点的前一个结点,令它的next等于我们要被删除的节点的next节点,即自己的next.next
class Solution(object):
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
t=ListNode(0)
t.next=head
tmp=t
N=1
while(tmp.next!=None):
N+=1
tmp=tmp.next
tmp2=t
for i in range(N-n-1):
tmp2=tmp2.next
print(tmp2)
tmp2.next=tmp2.next.next
return(t.next)
2.2 哨兵节点+双指针
设立双指针,fast比slow领先n位的话,我们可以找到要被删除的节点(即倒数第n个节点);fast比slow领先n+1位的话,可以找到要被删除的节点的前一位节点,让它的next等于被删除的节点的next节点,即自己的next.next
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
t=ListNode(0)
t.next=head
fast=t.next
slow=t
for i in range(n):
fast=fast.next
while(fast!=None):
fast=fast.next
slow=slow.next
slow.next=slow.next.next
return(t.next)
2.3 哨兵节点+栈
设立哨兵节点,然后将每一个链表的节点入栈,全部入栈后,弹出至倒数第n+1个节点,他就是我们要被删除的节点的前一个
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
t=ListNode(0)
t.next=head
lst=[]
tmp=t
#(tmp)
while(t!=None):
lst.append(t)
t=t.next
x=lst[-n-1]
print(x)
x.next=x.next.next
return(tmp.next)