2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案

1.题目描述

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

进阶:你能尝试使用一趟扫描实现吗?

2.解题报告

在对链表进行操作时,一种常用的技巧是添加一个哑节点(dummy node),它的 \textit{next}next 指针指向链表的头节点。这样一来,我们就不需要对头节点进行特殊的判断了。

例如,在本题中,如果我们要删除节点 yy,我们需要知道节点 yy 的前驱节点 xx,并将 xx 的指针指向 yy 的后继节点。但由于头节点不存在前驱节点,因此我们需要在删除头节点时进行特殊判断。但如果我们添加了哑节点,那么头节点的前驱节点就是哑节点本身,此时我们就只需要考虑通用的情况即可。

这个题目是双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。

3.最优答案

c答案


/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
//定义两个指针,刚开始分别指向头结点,然后先让一个指针先走n-1步,接着两个指针同时遍历链表,当第一个指针到达链表尾部的时候,第二个指针指向的就是要删除的倒数第n个结点。
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {struct ListNode *fast=head;struct ListNode *slow=head;for(int i=0;i<n;i++){fast=fast->next;if(fast==NULL) return head->next;}while(fast->next !=NULL){fast=fast->next;slow=slow->next;}slow->next=slow->next->next;return head;// struct ListNode *fast=head;// struct ListNode *slow=head;// int i;// for(i=0;i<n;i++)// {//     fast=fast->next;//     if(fast == NULL) return head->next; // }// while(fast->next != NULL)// {//     fast=fast->next;//     slow=slow->next;// }// slow->next=slow->next->next;// return head;
}

c++答案

class Solution {public:ListNode* removeNthFromEnd(ListNode* head, int n) {if (!head->next) return NULL;//空链表ListNode *pre = head, *cur = head;for (int i = 0; i < n; i++)cur = cur->next;if (!cur)return head->next;//cur==NULL,此时n大于链表长度,返回首元素while (cur->next){cur = cur->next;pre = pre->next;//cur先走了n个长度,领先pre了n个长度;所以当cur走到末尾时,pre刚好指向倒数第n个节点}pre->next = pre->next->next;return head;}};

java答案


/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode root =head;HashMap<Integer,ListNode> map = new HashMap<>();int count = 0;while(head != null){count += 1;map.put(count,head);head = head.next;}if(count == 1 || count == n){root = root.next;}else if(n == 1 && count ==2){map.get(count - n ).next = null;}else {map.get(count - n ).next = map.get(count - n + 2);}return root;}
}

JavaScript答案


/*** Definition for singly-linked list.* function ListNode(val) {*     this.val = val;*     this.next = null;* }*/
/*** @param {ListNode} head* @param {number} n* @return {ListNode}*/
var removeNthFromEnd = function(head, n) {if(head == null || n <= 0) {return head;}var dummy = new ListNode(0);dummy.next = head;var p = dummyvar q = dummyfor(var i = 0; i < n + 1; i++) {p = p.next;}while(p) {p = p.next;q = q.next}q.next = q.next.next;return dummy.next;// var count = 0;// var p = head;// while(p) {//     count++//     p = p.next// }// //顺数第m个// var m = count - n + 1;// var dummy = new ListNode(0);// dummy.next = head;// var cur = dummy;// for(var i = 1; i < m; i++) {//     cur = cur.next;// }// cur.next = cur.next.next;// return dummy.next;
};

c#答案


/*** Definition for singly-linked list.* public class ListNode {*     public int val;*     public ListNode next;*     public ListNode(int x) { val = x; }* }*/
public class Solution {public ListNode RemoveNthFromEnd(ListNode head, int n) {if(head==null)return null;var list=new List<ListNode>(){head};int i=0;while(i<list.Count){if(list[i].next!=null)   {list.Add(list[i].next);}i++;}if(list.Count==1){return null;}else if(list.Count==n){return list[1];}i=list.Count-n;if(i>-1){if(n==1){list[list.Count-2].next=null;}else if(i-i>=0 && i+1<list.Count)list[i-1].next=list[i+1];}return list[0];}
}

python2.x答案


# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution(object):def removeNthFromEnd(self, head, n):""":type head: ListNode:type n: int:rtype: ListNode"""dummy = ListNode(0)dummy.next = headfirst = second = dummyfor i in range(n):first = first.nextwhile first.next:first = first.nextsecond = second.nextsecond.next = second.next.nextreturn dummy.next

python3.x答案


# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def removeNthFromEnd(self, head, n):""":type head: ListNode:type n: int:rtype: ListNode"""head2 =[head.val]while head.next != None:head =head.nexthead2.append(head.val)head2.pop(-n)return head2

go答案


/*** Definition for singly-linked list.* type ListNode struct {*     Val int*     Next *ListNode* }*/func removeNthFromEnd(head *ListNode, n int) *ListNode {var arr []*ListNodearr = append(arr, head)for node := head; node.Next != nil; node = node.Next {arr = append(arr, node.Next)}if n == len(arr) {head = head.Next} else if n == 1 {del := arr[len(arr)-2]del.Next = nil} else {del := arr[len(arr)-n]deleteNode(del)}return head
}func deleteNode(node *ListNode) {next := node.Nextnode.Val = next.Valnode.Next = next.Next
}

4.算法面试宝典小程序

微信搜“算法面试宝典”,内含1000个算法题目的7种语言的top5答案和详细解题报告,无论是校招还是社招,让你算法面试中游刃有余,助力薪酬提升30%。

2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案相关推荐

  1. 2021字节跳动校招秋招算法面试真题解题报告--leetcode148 排序链表,内含7种语言答案

    148.排序链表 1.题目描述 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序 2.解题报告 针对nlogn的排序算法,主要有快速排序,归并排序和堆排序.其中,堆排序利用了数 ...

  2. 【算法面试必刷Java版八】链表中倒数最后k个结点

    盲目刷题,浪费大量时间,博主这里推荐一个面试必刷算法题库,刷完足够面试了.传送门:牛客网面试必刷TOP101

  3. 字节跳动-2020秋招-笔试题剖析【5道算法题】

    字节跳动-2020秋招-笔试题剖析[5道算法题],限时120分钟. 让我们一起来看看这些题吧! 题一:模型文件去重 [题目描述] 抖音上不同的用户类型我们有不同的用户模型文件. 我们有一个模型配置文件 ...

  4. 2019年字节跳动2020届秋招在线笔试真题(后端开发工程师)

    2019年字节跳动2020届秋招在线笔试真题(后端开发工程师) 第一题 第二题 第三题 第四题 第一题 第二题 第三题 第四题 字节跳动的题,对于我这个菜鸟来说确实很难,对一半都做不到.还得继续努力啊 ...

  5. 字节跳动2019春招算法题

    字节跳动2019春招算法题 1.总结 难度:容易到中等. 一些题出的太烂,不给数据范围,而且内存设置有问题,如果是刷题不建议刷. 2.题目 (1) 简单字符串模拟. #include<bits/ ...

  6. 算法题解(Leetcode 11、15、17、19、20:盛最多水的容器、三数之和、电话号码的字母组合、删除链表的倒数第 N 个结点、有效的括号)

    文章目录 [11. 盛最多水的容器 - 中等 - 9/7](https://leetcode-cn.com/problems/container-with-most-water/) [15. 三数之和 ...

  7. 字节跳动(秋招)计算机视觉算法工程师岗面试题分享

    问题1:BN过程,为什么测试和训练不一样? 对于BN,在训练时,是对每一批的训练数据进行归一化,也即用每一批数据的均值和方差. 而在测试时,比如进行一个样本的预测,就并没有batch的概念,因此,这个 ...

  8. 【字节跳动】秋招/实习转正,总有一种方法适合你

    秋招太难?实习转正也能加入字节跳动! 公司介绍: 成长环境: 秋招: ⚠️内推码:EJSDRMT 工作地点: 薪资福利: 招聘职位: 投递邮箱: 公司介绍: 字节跳动是全球增长最快的科技公司之一,月活 ...

  9. 字节跳动2020秋招研发笔试题

    字节跳动秋招研发笔试题 最近在忙考研,高数复习完了,看了下数据结构和算法,然后对人生比较迷茫. 该不该放弃考研,又怕考不上面临找工作的问题,索性看了几家科技巨头的秋招试题,贴下来和大家分享下 基本都是 ...

最新文章

  1. checkbox的相关知识点
  2. idea配置tomcat的方法
  3. Linux(六) 磁盘与文件系统
  4. css简单的数学运算
  5. Android7.1编译SDK报错解决方法总结
  6. SVN之版本管理系统安装及svnadmin编码问题-yellowcong
  7. mac的ftp工具-cyberduck
  8. 阿里云安全组规则授权对象设置为固定IP段访问
  9. java哪一个可以编译,下列Java命令中,哪一个可以编译HelloWorld.java文件( )
  10. TYPEC 转HDMI VGA+PD+ USB3.0 HUB+TF/CF/SD+RJ45等多功能扩展坞方案设计资料|TYPE-C转HDMI转VGA带PD USB3.0多功能拓展器方案介绍
  11. 环境实验耐高温、耐低温、温度变化、恒定湿热、湿热循环
  12. 0930-值得纪念的一天,永远不要心存侥幸
  13. 《穷爸爸与富爸爸》语录之二
  14. 多元线性回归分析示例
  15. docker部署smokeping监控网络掉包
  16. 2018-09-06 Java实现英汉词典API初版发布在Maven
  17. 新浪微博互粉php,新浪微博粉丝服务平台配置教程
  18. 如何查看某端口对应什么服务?
  19. SQL每日一题(20201218)来查找与之前(昨天的)日期相比温度更高的所有日期
  20. 按年/月/日统计数据

热门文章

  1. 中国科研人员开发出“蚁群”微型机器人
  2. VirtualBox :不能分配USB设备到虚拟电脑
  3. 机器学习在无线信道建模中的应用现状与展望
  4. (转)任正非对新员工的寄语:烧不死的就是凤凰
  5. 用python怎么读文件_python怎么读文件
  6. [matlab]获取多项式的系数,表达式的系数
  7. 1253本科2016c语言程序设计试题,1253电大《C语言程序设计A》试题和答案200901
  8. 密码学技术如何选型?终探量子计算通信的安全模型
  9. 在算力“沃土”上,种植互联网下一个奇迹十年
  10. 2022年五大人工智能自动化趋势