代码随想录算法训练营第第三天 | 203.移除链表元素 、707.设计链表、206.反转链表
203.移除链表元素
建议: 本题最关键是要理解 虚拟头结点的使用技巧,这个对链表题目很重要。
题目链接/文章讲解/视频讲解::https://programmercarl.com/0203.移除链表元素.html
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} val
* @return {ListNode}
*/
var removeElements = function(head, val) {
let first = new ListNode(null, head);
let cur = first;
while(first.next){
if (first.next.val===val) {
first.next = first.next.next;
} else {
first = first.next;
}
}
return cur.next;
};
707.设计链表
建议: 这是一道考察 链表综合操作的题目,不算容易,可以练一练 使用虚拟头结点
题目链接/文章讲解/视频讲解:https://programmercarl.com/0707.设计链表.html
class LinkNode{
constructor(val, next = null){
this.val = val;
this.next =next;
}
}
var MyLinkedList = function() {
this.head = null
this.size = 0;
};
MyLinkedList.prototype.getNode = function(index) {
if(index>=this.size){
return -1;
}
let count = 0;
let cur = this.head;
while(count<index){
cur = cur.next;
count++;
}
return cur;
};
/**
* @param {number} index
* @return {number}
*/
MyLinkedList.prototype.get = function(index) {
let cur = this.getNode(index);
return cur===-1?-1:cur.val;
};
/**
* @param {number} val
* @return {void}
*/
MyLinkedList.prototype.addAtHead = function(val) {
let cur = this.head;
let node = new LinkNode(val,cur);
this.head = node;
this.size++;
};
/**
* @param {number} val
* @return {void}
*/
MyLinkedList.prototype.addAtTail = function(val) {
let node = new LinkNode(val,null);
if (this.size===0) {
this.head = node;
} else {
let cur = this.head;
while(cur.next){
cur = cur.next;
}
cur.next = node;
}
this.size++;
};
/**
* @param {number} index
* @param {number} val
* @return {void}
*/
MyLinkedList.prototype.addAtIndex = function(index, val) {
if(index>this.size){
return;
}
this.size++;
if(index<=0){
this.addAtHead(val);
return;
}
if(index>=this.size){
this.addAtTail(val);
return;
}
const prevnode = this.getNode(index-1);
let node = new LinkNode(val);
node.next = prevnode.next;
prevnode.next = node;
};
/**
* @param {number} index
* @return {void}
*/
MyLinkedList.prototype.deleteAtIndex = function(index) {
if(index>=this.size){
return;
}
this.size--;
if(index===0){
this.head = this.head.next;
return;
}
let node = this.getNode(index-1);
node.next = node.next.next;
};
/**
* Your MyLinkedList object will be instantiated and called as such:
* var obj = new MyLinkedList()
* var param_1 = obj.get(index)
* obj.addAtHead(val)
* obj.addAtTail(val)
* obj.addAtIndex(index,val)
* obj.deleteAtIndex(index)
*/
206.反转链表
建议先看我的视频讲解,视频讲解中对 反转链表需要注意的点讲的很清晰了,看完之后大家的疑惑基本都解决了。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0206.翻转链表.html
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
if (head==null) {
return head;
}
let prev = null;
let cur = head;
while(cur&&cur.next){
let last = cur.next;
cur.next = prev;
prev = cur;
cur = last;
}
cur.next = prev;
return cur;
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?