18-代码随想录19删除链表的倒数第N个节点
19.删除链表的倒数第N个节点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
示例 1:
19.删除链表的倒数第N个节点
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2:
输入:head = [1], n = 1 输出:[] 示例 3:
输入:head = [1,2], n = 1 输出:[1]
代码
class ListNode:
def __init__(self,val=0,next=None):
self.val=val
self.next=next
class MyLinklist:
def __init__(self):
self.head=ListNode
self.size=0
def initList(self,data):
self.head=ListNode(data[0])
r=self.head
p=self.head
for i in data[1:]:
node=ListNode(i)
p.next=node
p=p.next
self.size+=1
return r
def printlist(self,head):
if head==None:return -1
else:
node=head
while node!=None:
print(node.val,end='')
node=node.next
def deletnode(self,l1,n):
head=l1
h=l1
n=int(n)
if self.size==0:#只有一个元素,只删除一个元素
if n==1:return
else:
for i in range(self.size + 1 - n):
q = h # 留个前
h = h.next # 移动到要删的元素的位置
if h.next and q: q.next = h.next
if h.next and q==None:head=h.next
if h.next==None and q:q.next=None
return head
if __name__=='__main__':
l=MyLinklist()
head=input("head=").split()
n=input("n=")
l1 = l.initList(head)
out=l.deletnode(l1,n)
l.printlist(out)
运行
小结
self.size+1才是真实长度,循环从0开始要循环self.size+1-n次,那么设置范围是range(self.size+1-n):[0-self.size-n]=[0-self.size+1-n)