线性表List

数组array是基本的数据结构,但它的功能有限,线性表list可以认为是扩展了功能的数组。可以自动调整大小。添加和删除元素不需要其他元素移位。

根据指针数量和指向的不同,线性表分为单向链表、双向链表和循环链表。

一、单向链表

单项链表有一个头指针,指向链表的第一个元素,除最后一个元素外,其它元素都有一个指针指向其后的元素。如图:

这种结构简单有效,可以非常方便的对链表进行遍历、查询、添加和删除元素。

class ListNode:
    def __init__(self,data):
        self.data=data
        self.next=None
        
class LinkList :
    def __init__( self ):
        self.head = None
        self._size = 0
    def is_empty(self):
        return self.head is None
    def __len__( self ):
        return self._size
    def __contains__( self, target ):
        curNode = self.head
        while curNode is not None and curNode.data != target :
            curNode = curNode.next
        return curNode is not None
    def search(self,target):
        curNode =self.head
        while curNode is not None and curNode.data !=target:
            curNode=curNode.next
        return curNode is not None
    def pre_add(self,data ):
        newNode = ListNode(data )
        newNode.next = self.head
        self.head = newNode
        self._size += 1
    def append(self,data):
        newNode=ListNode(data)        
        if self.head is None:
            self.head=newNode
            self._size+=1
            return 
        curNode=self.head
        while curNode.next is not None:
            curNode=curNode.next
        curNode.next=newNode
        self._size+=1
    def pre_del(self):
        if self.head is None:
            return 
        curNode=self.head
        print curNode.data
        self.head=curNode.next
    def pop(self):
        if self.head is None:
            return
        preNode=None
        curNode=self.head
        while curNode.next is not None:
            preNode=curNode
            curNode=curNode.next
        if curNode is self.head:
            print curNode.data
            self.head=None
            self._size-=1
        else:
            print curNode.data
            preNode.next=curNode.next
            self._size -=1    
        
    def travel(self,head):
        curNode=self.head
        while curNode is not None:
            print curNode.data
            curNode=curNode.next
    def remove( self, data ):
        predNode = None
        curNode = self.head
        while curNode is not None and curNode.data != data :
            predNode = curNode
            curNode = curNode.next

        self._size -= -1
        if curNode is self.head :
            self.head = curNode.next
        else :
            predNode.next = curNode.next
        return curNode.data

        
if __name__=='__main__':        
    test=LinkList()
    for i in range(10):
        test.append(i)
    test.pop()
    test.pop()
    print '*********************'
    test.pre_del()
    test.pre_del()
    print '*********************'
    print test.remove(4)
    print test.remove(5)
    print '*********************'
    test.travel(test.head)
    print test.search(5)

 

转载于:https://www.cnblogs.com/wangbin2188/p/6524687.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值