数据结构 - 1 线性表 - 3 链表 - 单向链表 - python

单向链表

单向链表

节点

链表实现的基本构造块是节点。每个节点对象必须至少保存两个信息。一个是存储数据元素的数据域(设域名为data),另一个是存储下一个结点地址的指针域(设域名为next)。

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
    
    # 查看节点的数据域
    def getData(self):
        return self.data

    # 查看节点的指针域
    def getNext(self):
        return self.next
	
    # 设置节点的数据域
    def setData(self,newdata):
        self.data = newdata

    # 设置节点的指针域
    def setNext(self,newnext):
        self.next = newnext

创建节点

node1 = Node(57)
node2 = Node(7)
node1.setNext(node2)
print(node1.getData()) # 57
print(node2.getData()) # 7
print(node1.getNext() == node2) # True
print(node2.getNext() == None) # True
node2.setData(1)
print(node2.getData()) # 1

单向链表的基本操作

  • LinkedList.isEmpty():返回链表是否为空。

  • LinkedList.length():返回链表的长度。

  • LinkedList.traversal():遍历链表。

  • LinkedList.add(x):在链表的头部添加一个节点。

  • LinkedList.append(x):在链表的尾部添加一个节点。

  • LinkedList.insert(i, x):在给定的位置插入一个元素。第一个参数是要插入的元素的索引,所以 a.insert(0, x) 插入列表头部等同于a.add(x)a.insert(a.length(), x) 等同于 a.append(x)

  • LinkedList.remove(x):移除链表中第一个值为 x 的节点。如果没有这样的节点,则输出错误。

  • LinkedList.pop(i, x):删除链表中给定位置的节点并返回它。

  • LinkedList.clear():删除链表中所有的节点。

  • LinkedList.search(x):返回链表是否有值为 x 的节点。

  • LinkedList.index(x):返回链表中第一个值为 x 的节点的从零开始的索引。如果没有这样的节点,则输出错误。

  • LinkedList.location(x):返回链表中第 x 个节点。如果没有这样的节点,则输出错误。

  • LinkedList.reverse():反转链表中的节点。

class LinkedList:
    def __init__(self):
        self.head = None
     
    # 返回链表是否为空。
    def isEmpty(self):
        return self.head is None
    
    # 返回链表的长度。
    def length(self):
        count = 0
        current = self.head
        while current is not None:
            count += 1
            current = current.getNext()
        return count
    
    # 遍历链表。
    def traversal(self):
        current = self.head
        while current is not None:
            print(current.getData(), end=' ')
            current = current.getNext()
        print()
    
    # 在链表的头部添加一个节点。
    def add(self, data):
        node = Node(data)
        node.setNext(self.head)
        self.head = node
    
    # 在链表的尾部添加一个节点。
    def append(self, data):
        node = Node(data)
        if self.isEmpty():
            self.head = node
        else:
            current = self.head
            while current.getNext() is not None:
                current = current.getNext()
            current.setNext(node) 
    
    # 在给定的位置插入一个元素。
    def insert(self, pos, data):
        if pos == 0:
            self.add(data)
        else:
            count = 0
            current = self.head
            while current != None:
                if count == pos - 1:
                    node = Node(data)
                    node.setNext(current.getNext())
                    current.setNext(node)
                    break
                else:
                    count += 1
                    current = current.getNext()
            if count < pos - 1:
                print("错误:链表插入的位置大于链表长度!")    
    
    # 移除链表中第一个值为 x 的节点。
    def remove(self, data):
        try:
            current = self.head
            previous = None
            while current != None:
                if current.getData() == data:
                    break
                else:
                    previous = current
                    current = current.getNext()
            if previous == None:
                self.head = current.getNext()
            else:
                previous.setNext(current.getNext())
        except:
            print("错误:链表中没有{0}元素!".format(data))
    
    # 删除链表中给定位置的节点并返回它。
    def pop(self, pos):
        if pos < self.length():
            if pos == 0:
                self.head = self.head.getNext()
            else:
                count = 0
                current = self.head
                while current!=None:
                    if count == pos - 1:
                        temp = current.getNext()
                        current.setNext(temp.getNext())
                        return temp.getData()
                    else:
                        count += 1
                        current = current.getNext()
        else:
            print("错误:链表删除的位置大于链表长度!")
    
    # 删除链表中所有的节点。
    def clear(self):
        self.head = None
    
    # 返回链表是否有值为 x 的节点。
    def search(self, data):
        current = self.head
        while current is not None:
            if current.getData() == data:
                return True
            else:
                current = current.getNext()
        return False
    
    # 返回链表中第一个值为 x 的节点的从零开始的索引。
    def index(self, data):
        current = self.head
        count = 0
        while current != None:
            if current.getData() == data:
                return count 
            else:
                count += 1
                current = current.getNext()
        print("错误:链表中没有{0}元素!".format(data))
    
    # 返回链表中第 x 个节点。如果没有这样的节点,则输出错误。
    def location(self, pos):
        count = 0
        current = self.head
        while current is not None:
            if count == pos:
                return current.getData()
            else:
                count += 1
                current = current.getNext()
        if count < pos:
            print("错误:链表索引的位置大于链表长度!")
    
    # 反转链表中的节点。
    def reverse(self):
        previous = None
        while self.head is not None:
            temp = self.head.getNext()
            self.head.setNext(previous)
            previous = self.head
            self.head = temp
        self.head = previous

对操作进行测试:

ll =  LinkedList()
print("查看是否为空:",ll.isEmpty()) #True
ll.traversal() # 
print("链表长度:", ll.length()) # 0
print('===================')
ll.add(2)
ll.traversal() # 2
print("链表长度:", ll.length()) # 1
print('===================')
ll.add(3)
ll.traversal() # 3 2
print("链表长度:", ll.length()) # 2
print('===================')
ll.append(7)
ll.traversal() # 3 2 7
print("链表长度:", ll.length()) # 3
print('===================')
ll.insert(1,4) 
ll.traversal() # 3 4 2 7
print("链表长度:", ll.length()) # 4
print('===================')
ll.insert(0,5)
ll.traversal() # 5 3 4 2 7
print("链表长度:", ll.length()) # 5
print('===================')
ll.insert(ll.length(),99)
ll.traversal() # 5 3 4 2 7 99
print("链表长度:", ll.length()) # 6
print('===================')
ll.remove(4)
ll.traversal() # 5 3 2 7 99
print("链表长度:", ll.length()) # 5
print('===================')
ll.remove(6)
ll.traversal() # 5 3 2 7 99
print("链表长度:", ll.length()) # 5
print('===================')
ll.pop(4)
ll.traversal() # 5 3 2 7
print("链表长度:", ll.length()) # 4
print('===================')
print(ll.location(0)) # 5
print('===================')
ll.reverse()
ll.traversal() # 7 2 3 5
print('===================')
ll.reverse()
ll.traversal() # 5 3 2 7
print('===================')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值