链表在力扣上的介绍:
链表(Linked List)是最简单的线性的、动态数据结构。理解它是理解树结构、图结构的基础。
区别于数组,链表中的元素不是存储在内存中连续的一片区域,链表中的数据存储在每一个称之为「结点」复合区域里,在每一个结点除了存储数据以外,还保存了到下一个节点的指针(Pointer)。
由于不必按顺序存储,链表在插入数据的时候可以达到 O(1)O(1) 的复杂度,但是查找一个节点或者访问特定编号的节点则需要 O(n)O(n) 的时间。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向上一个/或下一个节点的位置的链接(links)。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的访问往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。
链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。
后续题目都根据python代码去实现
python实现链表
#定义链表
class ListNode:
def __init__(self):
#val为当前节点的值
self.val = None
#next为下一个节点指向的地址
self.next = None
#自定义链表的基本操作
class ListNodeHandle:
def __init__(self):
self.cur_node = None
#实现节点的添加
def add(self, data):
#创建新节点
node = ListNode()
#节点赋值
node.val = data
#设置节点的地址
node.next = self.cur_node
#将节点的地址传给操作功能中的节点
self.cur_node = node
return node
#链表打印
def printInfo(self, node):
#遍历链表
while node:
print ('node: ', node, 'value: ', node.val, 'next: ', node.next)
node = node.next
if __name__ == '__main__':
n = ListNodeHandle()
l1 = ListNode()
l1_list = [1, 2, 3, 4, 5]
#循环添加数据
for i in l1_list:
l1 = n.add(i)
n.printInfo(l1)
LeetCode 习题
1、两数相加
题目:
举例:
思路:
本题目不难,只需要将两个链表循环,从第一个值开始相加。
唯一需要思考的点就是记录两数相加大于10怎么处理
初始化两个链表cur、res。 res目的是为了直接打印结果
初始化一个mid用来保存0 or 1,如果两数相加大于10,标记为1,用于下次计算
将相加后的值%10取模之后的值就是计算的结果
实现:
# Definition for singly-linked list.
class ListNode(object):
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def operator(l1, l2):
mid=0 #用来保存进位
cur=res=ListNode(0) #用来保存结果 cur可以直接打印结果
while l1 or l2 or mid: #如果l1 l2 或者进位还都不为空
t1=l1.val if l1 else 0
t2=l2.val if l2 else 0
res.next=ListNode((t1+t2+mid)%10) #相加取模,赋值给res.next
res=res.next #继续取下一个值
mid=1 if t1+t2+mid>=10 else 0 #如果两数相加大于10 则mid保存进位
l1=l1.next if l1 else l1
l2=l2.next if l2 else l2
return cur.next
def printInfo(l1):
while l1:
print (l1.val)
l1=l1.next
if __name__ == '__main__':
l1=ListNode(9,ListNode(8,ListNode(8)))
l2=ListNode(9,ListNode(9))
printInfo(operator(l1, l2))