Leetcode算法系列(链表)之删除链表倒数第N个节点

难度:中等
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list

Python实现

# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None class Solution(object):
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
"""
方法一:
1. 复制表头元素head1=head
2. 遍历单链表
将当前节点复制为head2
遍历当前节点后n个元素
若不够n个元素就到达链表末尾,返回整个链表恰好n位,删除首节点即可,即返回首节点下一节点
head2后移
若head2后移n个元素之后正好为空,则删除该节点head下一节点
返回表头元素head1
"""
i = 0
head1 = head
while head:
head2 = head
j = 0
while j < n + 1:
if not head2:
return head1.next
head2 = head2.next
j += 1
if not head2:
head.next = head.next.next
return head1
i += 1
head = head.next def removeNthFromEnd2(self, head: ListNode, n: int) -> ListNode:
"""
一次遍历,滑动串口
"""
fast = head
slow = head
for i in range(n):
fast = fast.next
if not fast:
# 链表长度为N的情况
return head.next while fast.next:
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return head def removeNthFromEnd3(self, head: ListNode, n: int) -> ListNode:
dummy = ListNode(0)
dummy.next = head
fast,slow = dummy,dummy
for i in range(n+1):
fast = fast.next
while fast is not None:
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return dummy.next def create_listnode(list1: list) -> ListNode:
print(list1)
list1_nodes = [ListNode(x=node) for node in list1]
i = 0
while i < len(list1) - 1:
list1_nodes[i].next = list1_nodes[i + 1]
i += 1 return list1_nodes[0] def print_lnode(lnode):
while lnode:
print(lnode.val)
lnode = lnode.next if __name__ == "__main__":
l1 = create_listnode(list1=[1,2,3,4,5])
solution = Solution()
# head = solution.removeNthFromEnd(head=l1, n=1)
head = solution.removeNthFromEnd2(head=l1, n=2)
# if head.__class__ == ListNode:
print_lnode(head)

Go语言实现

package main

import "fmt"

// Definition for singly-linked list.
type ListNode struct {
Val int
Next *ListNode
} func (h *ListNode) Show() {
fmt.Println(h.Val)
for h.Next != nil {
h = h.Next
fmt.Println(h.Val)
}
} func removeNthFromEnd1(head *ListNode, n int) *ListNode {
// 快慢指针法 先让快指针领先n个位置
// 当快指针到达nil时 慢指针即倒数第n个位置
// 0 ms 2.2 MB Golang
node := &ListNode{Next: head}
fast, slow, step := node, node, 0
for step < n {
fast = fast.Next
step++
}
for fast.Next != nil {
fast = fast.Next
slow = slow.Next
}
slow.Next = slow.Next.Next
return node.Next
} func removeNthFromEnd2(head *ListNode, n int) *ListNode {
// 数组循环存储最后N个元素,一次遍历
// 题目规定“给定的 n 保证是有效的。”所以不对n进行检查了
// 0 ms 2.2 MB Golang
var length int = n + 1
var tempNodes []*ListNode = make([]*ListNode, length)
var countNode int = 0
var tail *ListNode = head
for tail != nil {
tempNodes[countNode%length] = tail
tail = tail.Next
countNode++
}
if countNode == n { // 最后一个节点的情况
return head.Next
}
if n == 1 { // 第一个节点的情况
tempNodes[countNode%length].Next = nil
} else { // 中间的情况
tempNodes[countNode%length].Next = tempNodes[(countNode+2)%length]
}
return head
} func removeNthFromEnd3(head *ListNode, n int) *ListNode {
// 两次遍历
// 0 ms 2.2 MB Golang
if head.Next == nil {
return nil
}
node := &ListNode{Next: head}
pointer, pointer2, length := node, node, 1
for pointer.Next != nil {
pointer = pointer.Next
length++
}
index := length - n
for i := 1; i <= length; i++ {
if i == index {
if pointer2.Next == nil {
break
}
pointer2.Next = pointer2.Next.Next
break
} else {
pointer2 = pointer2.Next
}
}
return node.Next
} func removeNthFromEnd4(head *ListNode, n int) *ListNode {
// 递归实现 0 ms 2.2 MB Golang
head, _ = handler(head, 1, n)
return head
} func handler(head *ListNode, layer, n int) (*ListNode, int) {
if head == nil {
return head, layer - 1
}
next, maxNum := handler(head.Next, layer+1, n)
if layer == maxNum-n+1 {
return head.Next, maxNum
} else if layer == maxNum-n {
head.Next = next
return head, maxNum
} else {
return head, maxNum
}
} func create_link_list(list1 []int) *ListNode {
head := &ListNode{Val: list1[0]}
tail := head
for i := 1; i < len(list1); i++ {
tail.Next = &ListNode{Val: list1[i]}
tail = tail.Next
// head.Append(list1)
}
return head
} func main() {
l1 := []int{1, 2, 3, 4, 5}
fmt.Println(l1)
head1 := create_link_list(l1)
head2 := removeNthFromEnd4(head1, 2)
head2.Show()
}

执行结果

方法 执行用时 内存消耗 语言
python-遍历判断 40 ms 13.9 MB Python3
python-快慢指针,滑动窗口 40 ms 13.8 MB Python3
GO-快慢指针,滑动窗口 0ms 2.2MB Golang
Go-数组存储,一次遍历 0ms 2.2MB Golang
Go-两次遍历 0ms 2.2MB Golang
Go-递归实现 0ms 2.2MB Golang

Leetcode算法系列(链表)之删除链表倒数第N个节点的更多相关文章

  1. Leetcode算法系列(链表)之两数相加

    Leetcode算法系列(链表)之两数相加 难度:中等给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将 ...

  2. LeetCode(19):删除链表的倒数第N个节点

    Medium! 题目描述: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了 ...

  3. 数据结构:DHUOJ 删除链表的顺数及倒数第N个节点

    删除链表的顺数及倒数第N个节点 作者: turbo时间限制: 1S章节: DS:数组和链表 题目描述: 可使用以下代码,完成其中的removeNth函数,其中形参head指向无头结点单链表,n为要删除 ...

  4. 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解

    数据结构与算法系列2.2 线性表 什么是链表? 链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表的链接次序实现的一系列节点组成,节点可以在运行时动态生成,每个节点包括两个 ...

  5. 数据结构和算法之单向链表二:获取倒数第K个节点

    我们在做算法的时候或多或少都会遇到这样的问题,那就是我们需要获取某一个数据集的倒数或者正数第几个数据.那么今天我们来看一下这个问题,怎么去获取倒数第K个节点.我们拿到这个问题的时候自然而然会想到我们让 ...

  6. 19. [链表][双指针]删除链表的倒数第N个节点

    19. 删除链表的倒数第N个节点 方法一:哨兵节点+快慢指针 在本题中,快慢指针的用法为:让快指针先走几步,步数由 \(n\) 决定. 使用哨兵节点的理由是为了避免删除节点为头结点引发的空指针异常. ...

  7. 链表问题----删除链表的中间节点和a/b处的节点

    删除链表的中间节点和a/b处的节点 对于给定一个链表的头节点head,实现删除链表的中间节点的函数. 例如 不删除任何节点: 1->2,删除节点1 1->2->3,删除节点2 1-& ...

  8. 链表:删除链表中重复的结点(java实现)

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  9. 第18题:在O(1)时间删除链表结点+删除链表中重复的节点

    题目描述:题目描述在O(1)时间删除链表结点 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 考查创新编程能力. 思路: 1.如果从头到尾遍历,时间O(n) 2.如果将待删 ...

随机推荐

  1. 35、搜索插入位置 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(35)搜索插入位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 "无视要 ...

  2. 使用MyBatis框架时发现的一些小bug

    在大配置MyBatis.xml中:  不能有空节点属性 ,否则启动服务器后点击登录没有反应. 异常问题: ause: java.sql.SQLException: Value '0000-00-00 ...

  3. Jenkins远程发布制品

    目录 一.简介 二.实现 一.简介 WEB服务很少会与Jenkins服务器在同一台机器,所以需要将构建好的制品包,发放到远程服务器进行部署. 二.实现 插件名:Publish over SSH 作用: ...

  4. 【antd】form表单默认值设置

    问题: 在antd的form表单的api里面有个"initialValues"可以设置默认值.但是表单没有更新 <Form name="test" for ...

  5. <转>企业应用架构 --- 分层

    系统架构师-基础到企业应用架构-分层[上篇] 一.前言 大家好,接近一年的时间没有怎么书写博客了,一方面是工作上比较忙,同时生活上也步入正轨,事情比较繁多,目前总算是趋于稳定,可以有时间来完善以前没有 ...

  6. Markdown 语法粗学

    Markdown 语法粗学 Typora下载 Typora官网 下拉点击右上角 选择下载即可 里面选择自己想要的系统下载即可 如果下载缓慢,推荐使用各自的下载工具或者使用软件管家等 亲测迅雷速度尚可 ...

  7. CF1506A Strange Table 题解

    Content 给定一个 \(n\times m\) 的矩阵.一开始,\((1,1)\) 所在位置上面的数是 \(1\),随后先由上往下将这一列中的所有位置上面填上 \(2,3,\dots,n\),再 ...

  8. java源码——文件读写和单词统计

    本文要解决的问题:"键盘输入一段英语语句,将这段话写入content.txt中,然后输出这段话,并且统计语句中英文单词的数目以及各个单词出现的次数." 分析问题知,核心是文件读写和 ...

  9. 【LeetCode】345. Reverse Vowels of a String 解题报告(Java & Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 使用栈 双指针 日期 [LeetCode] 题目地址 ...

  10. 【LeetCode】1046. Last Stone Weight 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 大根堆 日期 题目地址:https://leetco ...