数组
数组是应用最广泛的一种数据结构,常常被植入到编程语言中,作为基本数据类型使用,因此,在一些教材中,数组并没有被当做一种数据结构单独拿出来讲解(其实数组就是一段连续的内存,即使在物理内存中不是连续的,在逻辑上肯定是连续的)。其实没必要在概念上做纠缠,数组可以当做学习数据结构的敲门砖,以此为基础,了解数据结构的基本概念以及构建方法
数据结构不仅是数据的容器,还要提供对数据的操作方法,比如检索、插入、删除、排序等
链表
链表顾名思义就是~链 链表是一种动态数据结构,他的特点是用一组任意的存储单元存放数据元素。链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的。跟数组不同链表不用预先定义大小,而且硬件支持的话可以无限扩展。
链表与数组的不同点:
数组需要预先定义大小,无法适应数据动态地增减,数据小于定义的长度会浪费内存,数据超过预定义的长度无法插入。而链表是动态增删数据,可以随意增加。
数组适用于获取元素的操作,直接get索引即可,链表对于获取元素比较麻烦需要从头一直寻找,但是适用与增删,直接修改节点的指向即可,但是对于数组就比较麻烦了,例如[1,2,3,4]需要在下标为1的位置插入-2,则需要将[2,3,4]后移,赋值ls[1]=-2
数组从栈中分配空间, 对于程序员方便快速,但自由度小。链表从堆中分配空间, 自由度大但申请管理比较麻烦.
链表支持的基本操作
1.初始化
2.获取链表长度
3.追加节点
4.设置节点
5.删除节点
6.反转链表
7.清空链表
单链表和双链表的区别
- 结构
删除操作
添加操作
注:链表的head中不作为链表中一个确切的元素,这样可以方便操作(插入,删除等)
实现
单链表的Py3实现
# -*- coding: utf-8 -*-
class Node(object):
def __init__(self,data):
self.data=data
self.next=None
class SingleLinkedList(object):
'''初始化链表'''
def __init__(self):
self.head=Node(None)
'''链表增加元素'''
def append(self,data):
node=Node(data)
pre=self.head
while pre.next:
pre=pre.next
pre.next=node
'''打印链表'''
def show(self):
pre=self.head.next
while pre:
print(pre.data,end=' ')
pre=pre.next
print()
''''获取链表长度'''
def __len__(self):
length=0
pre=self.head.next
while pre:
length+=1
pre=pre.next
return length
'''插入元素'''
def insert(self,index,data):
'''index转换'''
'''
插入的时候方便操作
如有 1 2 3 4 链表
插入-2位置相当于插入到index=4的位置
插入-3位置相当于插入到index=3的位置
'''
if index<0:
index=len(self)+2-abs(index)
if (index>len(self)+1):
return False
node=Node(data)
pre = self.head
while index-2>=0:
pre=pre.next
index-=1
temp=pre.next
pre.next=node
node.next=temp
''''删除元素'''
def delete(self,index):
'''
index转换
这里是len(self)+1-abs(index)
和insert不同
'''
if index<0:
index=len(self)+1-abs(index)
pre = self.head
while index-2>=0:
pre=pre.next
index-=1
temp=pre.next
pre.next=temp.next
'''获取节点'''
def get(self,index):
'''
index转换
这里是len(self)+1-abs(index)
和insert不同
'''
if index<0:
index=len(self)+1-abs(index)
if(index>len(self)):
print('index error for get')
return
pre = self.head
while index>0:
pre=pre.next
index-=1
print(pre.data)
sl=SingleLinkedList()
sl.append(1)
sl.append(2)
sl.append(3)
sl.show()
sl.insert(4,5)
sl.show()
sl.insert(-2,10)
sl.show()
sl.delete(2)
sl.show()
sl.delete(-2)
sl.show()
sl.get(-2)