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

数组

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

链表

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

链表与数组的不同点:

数组需要预先定义大小,无法适应数据动态地增减,数据小于定义的长度会浪费内存,数据超过预定义的长度无法插入。而链表是动态增删数据,可以随意增加。
数组适用于获取元素的操作,直接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=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)

双链表的Py3实现

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值