小白学数据结构——一、线性结构(数组&链表)

来源:互联网 发布:cf东东数据一键刷枪 编辑:程序博客网 时间:2024/05/21 05:22

数组

数组是应用最广泛的一种数据结构,常常被植入到编程语言中,作为基本数据类型使用,因此,在一些教材中,数组并没有被当做一种数据结构单独拿出来讲解(其实数组就是一段连续的内存,即使在物理内存中不是连续的,在逻辑上肯定是连续的)。其实没必要在概念上做纠缠,数组可以当做学习数据结构的敲门砖,以此为基础,了解数据结构的基本概念以及构建方法
数据结构不仅是数据的容器,还要提供对数据的操作方法,比如检索、插入、删除、排序等

链表

链表顾名思义就是~链 链表是一种动态数据结构,他的特点是用一组任意的存储单元存放数据元素。链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的。跟数组不同链表不用预先定义大小,而且硬件支持的话可以无限扩展。

链表与数组的不同点:

数组需要预先定义大小,无法适应数据动态地增减,数据小于定义的长度会浪费内存,数据超过预定义的长度无法插入。而链表是动态增删数据,可以随意增加。
数组适用于获取元素的操作,直接get索引即可,链表对于获取元素比较麻烦需要从头一直寻找,但是适用与增删,直接修改节点的指向即可,但是对于数组就比较麻烦了,例如[1,2,3,4]需要在下标为1的位置插入-2,则需要将[2,3,4]后移,赋值ls[1]=-2
数组从栈中分配空间, 对于程序员方便快速,但自由度小。链表从堆中分配空间, 自由度大但申请管理比较麻烦.

链表支持的基本操作

1.初始化

2.获取链表长度

3.追加节点

4.设置节点

5.删除节点

6.反转链表

7.清空链表

单链表和双链表的区别

  1. 结构
    这里写图片描述
    这里写图片描述
  2. 删除操作
    这里写图片描述
    这里写图片描述

  3. 添加操作
    这里写图片描述
    这里写图片描述

注:链表的head中不作为链表中一个确切的元素,这样可以方便操作(插入,删除等)

实现

单链表的Py3实现

# -*- coding: utf-8 -*-class Node(object):    def __init__(self,data):        self.data=data        self.next=Noneclass 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)

双链表的Py3实现

参考文献
http://www.cnblogs.com/skywang12345/p/3561803.html

阅读全文
0 0
原创粉丝点击