707. Design Linked List
1. 原始题目
Design your implementation of the linked list. You can choose to use the singly linked list or the doubly linked list. A node in a singly linked list should have two attributes: val
and next
. val
is the value of the current node, and next
is a pointer/reference to the next node. If you want to use the doubly linked list, you will need one more attribute prev
to indicate the previous node in the linked list. Assume all nodes in the linked list are 0-indexed.
Implement these functions in your linked list class:
- get(index) : Get the value of the
index
-th node in the linked list. If the index is invalid, return-1
. - addAtHead(val) : Add a node of value
val
before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. - addAtTail(val) : Append a node of value
val
to the last element of the linked list. - addAtIndex(index, val) : Add a node of value
val
before theindex
-th node in the linked list. Ifindex
equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. - deleteAtIndex(index) : Delete the
index
-th node in the linked list, if the index is valid.
Example:
MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1, 2); // linked list becomes 1->2->3
linkedList.get(1); // returns 2
linkedList.deleteAtIndex(1); // now the linked list is 1->3
linkedList.get(1); // returns 3
Note:
- All values will be in the range of
[1, 1000]
. - The number of operations will be in the range of
[1, 1000]
. - Please do not use the built-in LinkedList library.
2. 题目理解
设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val
和 next
。val
是当前节点的值,next
是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev
以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。
在链表类中实现这些功能:
- get(index):获取链表中第
index
个节点的值。如果索引无效,则返回-1
。 - addAtHead(val):在链表的第一个元素之前添加一个值为
val
的节点。插入后,新节点将成为链表的第一个节点。 - addAtTail(val):将值为
val
的节点追加到链表的最后一个元素。 - addAtIndex(index,val):在链表中的第
index
个节点之前添加值为val
的节点。如果index
等于链表的长度,则该节点将附加到链表的末尾。如果index
大于链表长度,则不会插入节点。 - deleteAtIndex(index):如果索引
index
有效,则删除链表中的第index
个节点。
示例:
MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1,2); //链表变为1-> 2-> 3
linkedList.get(1); //返回2
linkedList.deleteAtIndex(1); //现在链表是1-> 3
linkedList.get(1); //返回3
提示:
- 所有值都在
[1, 1000]
之内。 - 操作次数将在
[1, 1000]
之内。 - 请不要使用内置的 LinkedList 库。
注意·的点:空链表,索引范围为0~超出链表长度~我改了两次才通过。
3. 解题
class ListNode: # 定义结点类型
def __init__(self, x):
self.val = x
self.next = None class MyLinkedList: def __init__(self):
"""
Initialize your data structure here.
"""
self.head = None # 初始化一个头结点为空 def get(self, index: int) -> int: # 返回第index个结点,若index不合法则返回-1
"""
Get the value of the index-th node in the linked list. If the index is invalid, return -1.
"""
if self.head == None: # 空链表对于所有index都不合法
return -1
p = self.head
for i in range(index):
if not p.next:
return -1
p = p.next
return p.val def addAtHead(self, val: int) -> None: # 在头部插入一个结点
"""
Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list.
"""
if self.head == None: # 对空链表直接将该结点赋予头结点即可
self.head = ListNode(val)
else:
new_node = ListNode(val)
new_node.next = self.head
self.head = new_node # 更新头结点 def addAtTail(self, val: int) -> None: # 在尾部插入一个结点
"""
Append a node of value val to the last element of the linked list.
"""
if self.head == None: # 对空链表直接将该结点赋予头结点即可
self.head = ListNode(val)
p = self.head
while(p.next):
p = p.next
p.next = ListNode(val) def addAtIndex(self, index: int, val: int) -> None: # 在第index位置插入结点
"""
Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted.
"""
p = self.head
new_node = ListNode(val)
if not self.head: # 若为空链表,除非index=0,才将其作为头结点,否则一切index都不合法
if index==0:
new_node.next = self.head
self.head = new_node
return None
for i in range(index-1):
if not p.next:
return None
p = p.next
new_node.next = p.next
p.next = new_node def deleteAtIndex(self, index: int) -> None: # 删除index位置的结点
"""
Delete the index-th node in the linked list, if the index is valid.
"""
if not self.head: # 空链表退出
return None
if index == 0: # 头结点单独考虑,直接将头结点赋予下一个结点即可
self.head = self.head.next
return None
p = self.head
for i in range(index-1):
if not p.next:
return None
p = p.next
if p.next:
p.next = p.next.next
4. 验证
验证之前可以写一个print函数打印当前链表情况:写到类里面去
def printlist(self):
p = self.head
while(p):
print(p.val,end=' ')
p = p.next
print('\n')
测试:
linkedList = MyLinkedList() linkedList.addAtHead(5)
linkedList.printlist() linkedList.addAtHead(2)
linkedList.printlist() linkedList.deleteAtIndex(1)
linkedList.printlist() linkedList.addAtIndex(1,9)
linkedList.printlist() linkedList.addAtHead(4)
linkedList.printlist() linkedList.addAtHead(9)
linkedList.printlist() linkedList.addAtHead(8)
linkedList.printlist() print(linkedList.get(3) ) linkedList.addAtTail(1)
linkedList.printlist() linkedList.addAtIndex(3,6)
linkedList.printlist() linkedList.addAtHead(3)
linkedList.printlist()
5
2 5
2
2 9
4 2 9
9 4 2 9
8 9 4 2 9
2
8 9 4 2 9 1
8 9 4 6 2 9 1
3 8 9 4 6 2 9 1
707. Design Linked List的更多相关文章
- 【Leetcode_easy】707. Design Linked List
problem 707. Design Linked List 参考 1. Leetcode_easy_707. Design Linked List; 完
- #Leetcode# 707. Design Linked List
https://leetcode.com/problems/design-linked-list/ Design your implementation of the linked list. You ...
- 【LeetCode】707. Design Linked List 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- LeetCode 707. Design Linked List (设计链表)
题目标签:Linked List 题目让我们自己设计一个 linked list,可以是单向和双向的.这里选的是单向,题目并不是很难,但要考虑到所有的情况,具体看code. Java Solution ...
- [LeetCode] Design Linked List 设计链表
Design your implementation of the linked list. You can choose to use the singly linked list or the d ...
- [Swift]LeetCode707. 设计链表 | Design Linked List
Design your implementation of the linked list. You can choose to use the singly linked list or the d ...
- 【LeetCode】Design Linked List(设计链表)
这道题是LeetCode里的第707到题.这是在学习链表时碰见的. 题目要求: 设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的 ...
- LeetCode707:设计链表 Design Linked List
爱写bug (ID:iCodeBugs) 设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下一个节点的指针/ ...
- Design Linked List
Design your implementation of the linked list. You can choose to use the singly linked list or the d ...
随机推荐
- 购物demo
这段时间从一个模板网站上拷了个购物系统的demo,试着写了一下,发现div+css布局还真是精妙无穷呢.设置好了布局,加上动态效果也只是锦上添花而已.所以,接下来的重点就是布局了! 我把网址粘上去:h ...
- 面向对象【day08】:类的起源与metaclass(二)
本节内容 1.概述 2.类的起源 3.__new__方法 4.__metaclass__方法 一.概述 前面我们学习了大篇幅的关于类,通过类创建对象,那我们想知道这个类到底是怎么产生的呢?它的一切来源 ...
- angular,vue,react的基本语法—插值表达式,渲染数据,响应式数据
基本语法: 1.插值表达式: vue:{{}} react:{} angular:{{}} 2.渲染数据 vue js: export default{ data(){ return{ msg:&qu ...
- SpringBoot+Thyemleaf
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...
- CSS-With-BEM
Naming rules block_name__element_name--modifier_name-modifier_value Names are written in lowercase L ...
- 【1】【leetcode-99】 恢复二叉搜索树
(没思路) 99. 恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ ...
- Timus 1132 Square Root(二次剩余)
http://acm.timus.ru/problem.aspx?space=1&num=1132 题意: 求 x^2 ≡ n mod p p是质数 的 解 本题中n>=1 特判p=2 ...
- Ant和Maven
Ant和Maven都是基于Java的构建(build)工具.理论上来说,有些类似于(Unix)C中的make ,但没有make的缺陷.Ant是软件构建工具,Maven的定位是软件项目管理和理解工具. ...
- springboot(二十一):SpringBoot使用Mybatis注解开发教程-分页-动态sql
https://blog.csdn.net/KingBoyWorld/article/details/78948304
- 解决 Entity Framework 6.0 decimal 类型精度问题
Ø 前言 本文主要解决 EF 中对于 MSSQL 数据库的 decimal 类型经度问题,经实验该问题仅在 CodeFirst 模式的情况下发生,话不多说直接看代码. 1. 假设我们有一张 Cu ...