python实现单链表

每个node节点包含一个val,与next指针指向下个节点。实现基本的链表操作,其中反转链表操作有个小坑,需要注意。

reverse过程中设置两个滚动指针pre与cur,初始值为pre=None,cur=self.head,这样反转后能保证head.next=None。错误的方式为设置pre=self.head与cur=self.head.next,这样虽然head之后的节点(不包括head)能正确反转,但是head.next不为空,仍然指向下一个节点,结果导致第一个与第二个节点死循环。

class Node(object):  
    def __init__(self, val):  
        self.val = val  
        self.next = None  
  
class LinkList(object):  
    def __init__(self):  
        self.head = None  
  
    def __len__(self):  
        length = 0  
        p = self.head  
        while p:  
            length += 1  
            p = p.next  
        return length

    def print_data(self):  
        p = self.head  
        while p:  
            print(p.val)
            p = p.next  
  
    def append(self, data):  
        node = Node(data)  
        if self.head is None:  
            self.head = node  
        else:  
            p = self.head  
            while p.next:  
                p = p.next  
            p.next = node  
  
    def get_element(self, index):  
        if index < 0 or index >= len(self):  
            return None  
        p = self.head  
        while index > 0:  
            p = p.next  
            index -= 1  
        return p  
  
    def locate_element(self, data):  
        if self.head is None:  
            return -1  
        p = self.head  
        index = 0  
        while p:  
            if p.val == data:  
                return index  
            p = p.next  
            index += 1  
        return -1  
  
    def insert(self, index, data):  
        node = Node(data)  
        if index < 0 or index >= len(self):  
            return None  
        if index == 0:  
            node.next = self.head  
            self.head = node  
        else:  
            p = self.get_element(index-1)  
            node.next = p.next  
            p.next = node  
  
    def delete(self, index):  
        if index < 0 or index >= len(self):  
            return False  
        if len(self) == 1:  
            self.head = None  
        else:  
            p = self.get_element(index-1)  
            p.next = p.next.next  
        return True  
  
    def reverse(self):  
        if len(self) <= 1:  
            return 
        else:  
            pre = None  
            cur = self.head  
            while cur:  
                tem = cur.next
                cur.next = pre
                pre = cur
                cur = tem
        self.head = pre

    def clear_list(self):  
        self.head = None  
  
    def list_length(self):  
        return len(self)  
  
    def is_empty(self):  
        return self.head is None  
  
linklist = LinkList()
linklist.append(1)
linklist.append(2)
linklist.append(3)
linklist.append(4)
print('length is %d'%len(linklist))

print('------')
linklist.print_data()
print('------')

linklist.insert(2, 10)
print('------')
linklist.print_data()
print('------')

linklist.delete(3)
print('------')
linklist.print_data()
print('------')

linklist.reverse()
print('------')
linklist.print_data()
print('------')

运行结果如下。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值