NO.19删除链表的倒数第N个节点

#循环迭代
# 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: ListNode, n: int) -> ListNode:
        if not head :
            return []
        #设置虚拟节点dummy,指向ListNode(0),并将dummy.next连接在head
        dummy = ListNode(0)
        dummy.next = head
        cur=head #初始化cur
        length=0
        #计算ListNode的长度,利用cur=cur.next进行遍历
        while cur:
            length+=1
            cur=cur.next
        #找到倒数第n个的节点的前面的那一个点
        cur =dummy # 重新赋初点
        len = 0 #记录长度
        cur = dummy
        for _ in range(length - n):
            cur = cur.next
        #删除节点,再连接
        cur.next = cur.next.next
        return dummy.next
#快慢指针-到达节点的前一
class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        if not head :
            return []
        dummy = ListNode(0)
        dummy.next = head #同法一
        fast,slow = dummy,dummy#设置快慢指针
        #先让快指针先走n步(很妙嗷)
        i = 0
        while i <n:
            i+=1
            fast = fast.next
        #此时fast离尾节点还有l-n,slow离倒数第n个节点还有l-n,恰好开始同时进行
        #结果是fast到达尾,slow到达前一节点
        while fast and fast.next:
            fast,slow = fast.next,slow.next
        #删除此节点,重新连接
        slow.next = slow.next.next
        return dummy.next
#回溯
class Solution:  
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        if not head: 
            self.count = 0
            return head  #简单判断
        head.next = self.removeNthFromEnd(head.next, n) # 递归调用
        self.count += 1 # 回溯时进行节点计数
        return head.next if self.count == n else head 

主要学习在python中链表的表示方式,以及熟悉循环,递归和双指针在本体中的使用

 
posted @ 2022-07-11 16:15  是冰美式诶  阅读(32)  评论(0)    收藏  举报