目录
哑结点
为什么设置哑节点?
方法1(先遍历统计长度,再查找具体位置):
方法2(双指针):
链表基本用法
哑结点
在链表前面添加哑节点,指向头节点
为什么设置哑节点?
正常来说题目分为2种情况:
- 一般情况:上一个结点的next指向下一个节点即可
-
node.next=node.next.next
- 当要删结点是头节点的时候
-
head=head.next
当然,可以分类来做
也可以采用哑结点避免讨论。
方法1(先遍历统计长度,再查找具体位置):
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:#哑节点创建dummy = ListNode(0, head)#这里计算链表长度不能放在哑节点创建前面length = 0while head:length += 1head = head.next#cur是一个遍历的指针cur = dummy#length-n次for i in range(length - n):cur = cur.nextcur.next = cur.next.nextreturn dummy.next
方法2(双指针):
不需统计链表长度
one,two两个指针,同时从头结点出发
one先跑n格,再同时一起跑,one到达终点(即one.next=NULL)时,two.next就是要删除的结点
(该图用fist,second演示,都一样)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:#哑节点创建dummy = ListNode(0, head)one=headtwo=dummy#one先跑for i in range(n):one=one.next#one,two一起跑,直到one为空while one:one=one.nexttwo=two.next#two的下一个就是要删的two.next=two.next.nextreturn dummy.next
感谢carl神