#使用链表这个数据结构,对一组数据进行插入排序

__author__ = 'zhouhai'
#使用链表这个数据结构,对一组数据进行插入排序
class Node:
    def __init__(self,number,next=None):
        self.number = number
        self.next = next


    def __repr__(self):
        return  self.number


class LinkList:
    def __init__(self,head):
        self.head = head


    def getLength(self):
        if self.head == None:
            return 0
        count = 1
        p = self.head.next
        while p != None:
            count += 1
            p = p.next


    def insert_after(self,target,number):
        temp = target.next
        target.next = number
        number.next = temp


    def printLink(self):
        p = self.head
        while p !=None:
            print(p.number,end=' ')
            p = p.next




#直接插入排序(Straight Insertion Sort)
if __name__ =='__main__':
    #待排序的一组数据
    numbers = [6,3,1,7,8,10,0,56,3,35,23,123,45,0,12,34,1,7]
    #取第一个数,作为一个基点,此时链表只有一个数值
    link = LinkList(Node(numbers[0],None))


    #从第2个数字开始,依次取出每一个数字,根据数值的大小,决定插入在列表中的哪里
    for i in range(1,len(numbers)):
        p = link.head
        pre = p
        while p != None:
            #找到位置,开始进行插入操作
            if numbers[i] <= p.number:
                temp = Node(numbers[i],None)
                if p == link.head:
                    temp.next = p
                    link.head = temp
                else:
                    pre.next = temp
                    temp.next = p
                break
            #否则,就取下个数值进行比较
            else:
                pre = p
                p = p.next
        #如果比较完成,链表里面都没有比这个数大的,说明这个数应该插在链表的最后面
        if p  == None:
            pre.next = Node(numbers[i])


    link.printLink()


总结:对于链表还用得不熟悉,需要对链表头的插入做特殊处理。否则会出现问题

                if p == link.head:
                    temp.next = p
                    link.head = temp
                else:
                    pre.next = temp
                    temp.next = p





















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值