题目:
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
示例1:
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
输入:head = [1], n = 1 输出:[]
输入:head = [1,2], n = 1 输出:[1]
解法一:(计算链表长度)
解题思路:
在头结点前设置一个哑结点dummy,并指向head头结点。
哑结点的好处就是不需要考虑特例,不用担心head当前节点是不是为空,当前head节点会不会被删除。
首先遍历一遍链表,并计数,看共有多少个元素,计数共k个。
重新将head放回哑结点处,一步步往后移动k-n-1步,此时head位于第k-n-1个元素位置上,现在就要将head.nexy指向head.next.next,以此删除这个节点。最后返回dummy.next
dummy=ListNode(0,head)
cur=dummy
k=0
while(cur.next):
cur=cur.next
k+=1
cur=dummy
for i in range(k-n):
cur=cur.next
cur.next=cur.next.next
return dummy.next
解法二:(栈)
解题思路:同样需要遍历链表计算长度,还会另外消耗内存保存元素
在头结点前设置一个哑结点dummy,并指向head头结点。设置空列表stack=list().
第一步,放cur到哑结点处,遍历一遍链表,并计数,看共有多少个元素,同时将每个元素添加进列表stack中,计数共k个。
第二步,从列表尾部依次删除n个元素,此时刚好把需要删除的节点删除了,此时将设置p放在列表最后一个元素,同时设置p.next指向p.next.next。最后返回dummy.next。
#栈
dummy = ListNode(0, head)
stack = list()
cur = dummy
while cur:
stack.append(cur) #从头结点前面增加的元素开始放进列表,就不需要单独考虑第一个元素
cur=cur.next
for i in range(n):
stack.pop() #从列表尾部一个个删除元素
p = stack[-1]
p.next =p.next.next
return dummy.next
知识点:
知识1:dummy=ListNode(0,head)
表示在head头结点前再设置一个节点,同时下一个元素指向head头结点。
优点:一定要记住,在头结点前面添加元素,就不用考虑第一个元素是否为空,第一个元素会不会被删除的情况,同时可以抵消python中以0开端的情况,计数更清晰。
知识2:建立空列表、空链表
a=[] ,b=list() #都能建立空列表,同时list也是关键字
stack=ListNode()
知识3:pop()函数
list.pop()表示默认删除最后一个元素,如果给参数list.pop(1),表示删除从前面的第二个元素。
知识4:将列表中的某一个值(这个值同时也在链表中)赋值给某个变量,通过这个变量也可以指针指回链表中。