leetcode-explore-learn-数据结构-链表1
- 1.概述
- 1.1 链表插入操作
- 1.2 链表删除操作
- 2.设计链表
本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/linked-list/
所有例题的编程语言为python
1.概述
链表是一种线性结构,每个元素都是一个单独对象,所有的对象通过每个元素的引用字段链接在一起。
链表包括单链表和双链表,本文主要记录单链表的相关内容。
单链表的每个节点包含两个部分的内容–链接到下一个结点的引用字段和值
Python中单链表节点的结构
class SinglyListNode(object,val):def __init__(self,val):self.val=valself.next=None
大多数情况下,我们使用头结点来表示整个列表。
与数组不同,访问单链表的中的元素需要的时间复杂度为0(n),从头结点开始,往后逐个遍历。
链表的主要优点:插入和删除操作很便利
1.1 链表插入操作
(1)用给定值初始化新结点cur
(2)将cur的Next字段链接到prev的下一个结点next
(3)将prev的next字段链接到cur结点
相比与数组添加新的元素(需要插入元素后续位置元素往后移动),链表插入操作可以实现o(1)的时间复杂度。
在列表的开头添加新节点更新head关重要。
(1)初始化一个新节点cur
(2)将新节点链接到原始head节点指向的下一个结点
(3)更新head节点指向cur
1.2 链表删除操作
要求删除给定节点cur
(1)找到cur节点的上一个结点prev和下一个结点next;
(2)将pre的next字段链接至next结点
找到cur结点的prev结点的时间复杂度为o(n),找到cur的下结点时间复杂度o(1),所以总体时间复杂度为o(n)
空间复杂度为0(1)。
删除第一个节点:直接将第二个节点分配给head
2.设计链表
设计链表的实现。单链表节点有两个熟悉:val、next。val是当前节点的值,next是指向下一个结点的指针/引用。
在链表中实现:
1.get(index):获取链表的第index个节点,如果索引无效,则返回-1(index 从0开始)
2.addAtHead(val):在链表的第一个结点前添加一个值为val的结点。插入后,新节点将成为链表的第一个结点
3.addAtTail:将值为val的节点追加到链表的最后一个元素
4.addAtIndex(index,val):在链表的第index个节点前添加值为val的结点。如果index为链表的长度,则将该结点按附加到链表的末尾。如果index大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
5.deleteAtIndex(index):如果索引有效则删除链表的第index个结点。
class ListNode:def __init__(self,x):self.val=xself.next=Noneclass MyLinkedList(object):def __init__(self):"""Initialize your data structure here."""self.size=0self.head=ListNode(0)def get(self, index):"""Get the value of the index-th node in the linked list. If the index is invalid, return -1.:type index: int:rtype: int"""if index<0 or index>=self.size:return -1node=self.headfor _ in range (index+1): # index 从0开始 node=node.nextreturn node.valdef addAtHead(self, 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.:type val: int:rtype: None"""self.addAtIndex(0,val)def addAtTail(self, val):"""Append a node of value val to the last element of the linked list.:type val: int:rtype: None"""self.addAtIndex(self.size,val)def addAtIndex(self, index, val):"""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.:type index: int:type val: int:rtype: None"""if index>self.size:returnif index<0:index=0self.size+=1pred=self.headfor _ in range(index): #[0,index-1]pred=pred.nextnode=ListNode(val)node.next=pred.nextpred.next=nodedef deleteAtIndex(self, index):"""Delete the index-th node in the linked list, if the index is valid.:type index: int:rtype: None"""if index<0 or index>=self.size:returnself.size-=1pred=self.headfor _ in range(index): # [0,index-1]pred=pred.nextpred.next=pred.next.next