线性表

线性结构:

(1)      存在惟一一个“第一个”元素和“最后一个”元素

(2)      除第一个元素外,每个数据仅有一个“前驱”和“后继”

1.   线性表

2.      线性表:n个数据元素的有限集合

n定义为线性表的长度

3.      线性表的顺序表示和实现

顺序表示:用一组地址连续的存储单元依次存储

存储位置的关系:

L : 每个元素占用的存储单元

线性表的顺序存储结构是一种随机存取的存储结构(只要确定了表的起始位置,任一元素可随机存取)

通常用数组来描述数据结构中的顺序存储结构。

 

4.      线性表的插入与删除

插入:由于逻辑上相邻的数据结构在物理上相邻,因此插入必须原来数据元素向后移动

删除:原来的数据向前移动

时间复杂度为O(n)

上两种操作的时间主要消耗在数据移动,而移动的元素个数取决于插入(删除)的位置

 

移动元素的次数:

插入:E = n/2          删除:E = (n-1)/2

在顺序存储结构中,插入或删除一个元素,平均移动表中一半数据。

 

2. 线性链表

特点:使用一组任意的存储单元存储(也就是,物理地址可以不连续)

 

存储地址

数据元素

指向下一元素地址指针

 

整个链表的存取必须从头指针开始,头指针指向第一个元素的存储地址

 

p->data = 

p->next->data =

 

单链表是非随机存取的存储结构

 

2.1 插入和删除

插入



删除


仅需要修改指针,不需要一定元素。时间复杂度为O(n)

3. 循环链表

特点:表中最后一个元素的指针域指向头节点,整个链表形成一个环。

操作与线性链表一致,区别在于判断p或p ànext是否为头节点

 

4. 双向链表

单向链表的缺点:从某个节点出发后只能往后查询其他节点,想要查询给节点的前驱,需要从头指针出发

 

双向链表

前驱(prior)

数据元素

后继(next)

 


 

4.1   插入和删除

需要修改两个方向的指针,时间复杂度为O(n)

插入


删除


实现:
# -*- coding: utf-8 -*-
"""
Created on Fri Jun 22 09:41:08 2018
单链表
@author: dell-1
"""
#
class ListNode:
    def __init__(self, elem, p=None):
        self.elem = elem
        self.next = p
        
class LinkList(object):
    def __init__(self):
        self.head = None
        
    def creat(self,data):
        self.head = ListNode(data[0])
        p = self.head
        for i in data[1:]:
            p.next = ListNode(i)
            p = p.next
            
    def print_Link(self):
        p =self.head
        while p is not None:      
            print(p.elem)
            p = p.next
            
    def length(self):
        length = 0
        p = self.head
        while p is not None:
            length += 1
            p = p.next
        print(length)
        
    def is_empty(self):
        return self.length == 0
        
    def insert_trail_data(self,item):
        #从表尾插入数据
        if self.is_empty():
            self.head = ListNode(item)
        else:
            p = self.head
            while p.next is not None:
                p = p.next
            p.next = ListNode(item)
    
    def getItem(self, index):
        #获取指定位置的数据
        if self.is_empty():
            print('链表为空')
            return
#        if index >= self.length() or index<0:
#            print('index超出链表大小')
#            return
        p = self.head
        count = 0
        while count != index:
            p = p.next
            count += 1
        print(p.elem)
        
    def insert_data(self,index,item):
        #从表的任意位置插入数据
        if index == 0:
            self.head = ListNode(item,self.head)
        else:
            p = self.head
            count = 0
            while count != index-1:
                p = p.next
                count += 1
            p.next = ListNode(item,p.next)
    
    def del_data(self,index):
        #删除指定位置的元素
        if index == 0:
            p = self.head
            self.head = p.next
        else:
            count = 0
            p = self.head
            while count != index-1:
                p = p.next
                count += 1
            p.next = p.next.next
        
    def clear(self):
        self.head = None
            
    def print_reverse_Link(self):
        out = []  
        p = self.head
        while p is not None:
            out.append(p.elem)
            p = p.next
        out.reverse()
        print(out)
            
a = LinkList()
a.creat([1,2,34,5])
a.insert_data(1,333)
print(a.print_reverse_Link2())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值