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. 在写易买网时产生的错误 JSTL标签库中<c:choose></c:choose>不能放JSP页面<!-- -->注释

    最近在使用JSTL标签库的<c:choose>标签时候,发现在该标签体中加了JSP的<!-- -->注释时,总是会显示报错信息.错误的信息如下: org.apache.jasp ...

  2. Mysql安全加固

    1.确保MYSQL_PWD环境变量未设置 描述 MYSQL_PWD环境变量的使用意味着MYSQL凭证的明文存储,极大增加MySQL凭据泄露风险. 加固建议 删除系统环境变量中MySQL密码(MYSQL ...

  3. TSN(时间敏感网络)测试、仿真、分析平台应用攻略

    前言 在汽车领域,近几年车内网络通讯方式的变革诉求,期望能够有更高的数据传输速率,以及保证实时性的通讯方式引入.例如对于ADAS而言,传统的CAN总线已经远远不能满足其对通讯的要求,而基于车载以太网的 ...

  4. 前端浅谈---协议相关(TCP连接)

    TCP连接 http的描述里面,我弱化了交互过程的描述,因为它相对复杂.所以我在此单独描述.客户端和服务端传递数据时过程相对谨慎和复杂,主要是开始和结束的过程.而这整个过程就是TCP连接.连接流程大体 ...

  5. Hibernate框架使用之环境搭建

    第一步:引入所需的jar包 第二步:创建实体类,配置实体类与数据表的映射关系 创建实体类 User.java package cn.hao.entity; public class User { /* ...

  6. [BUUCTF]PWN——铁人三项(第五赛区)_2018_rop

    铁人三项(第五赛区)_2018_rop[32位libc泄露] 题目附件 解题步骤: 例行检查,32位,开启了NX保护 试运行一下程序,一开始让我们输入,然后直接输出"Hellow,world ...

  7. 日历的种类(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著   日历有三种:标准日历.24小时日历和夜班日历. 设置的位置在[项目]>[属性]>[更改工作时间]>[ ...

  8. NOAA数据下载方法

    NOAA OneStop https://data.noaa.gov/onestop/about NOAA 数据搜索平台,在一个地方同时搜索NOAA的 Geophysical, oceans, coa ...

  9. 尚硅谷SSM-CRUD实战Demo

    SSM-CRUD实战项目 1. 项目总览 SpringMVC + Spring + MyBatis CRUD:增删改查 功能: 分页 数据校验 jquery前端校验+JSR303后端校验 ajax R ...

  10. LuoguB2028 反向输出一个三位数 题解

    Content 给定一个三位数,请反向输出它. 数据范围:数值在 \(100\) 到 \(999\) 之间. Solution 如果我们把它当做是一个字符串来读入的话,这道题目就很简单了.STL 当中 ...