数据结构——单链表

单链表的结构

单链表结构

  • 表元素域val用来存放具体的数据。
  • 链接域next用来存放下一个节点的位置
  • 变量head指向链表的头节点(首节点)的位置,从head出发能找到表中的任意节点。

单链表节点实现

class LinkListNode(object):
    """
        单链表节点类初始化
    """
    def __init__(self, val=None, next=None):
        self.val = val
        self.next = next

单链表的实现

class SingleLinkList(object):
    """
        生成链表及链表操作类
    """
    def __init__(self, head=None):
        self.head = head

图解说明

单链表的实现及操作

  • is_empty() 链表是否为空
  • length() 链表长度
  • traversal() 遍历整个链表
  • add(item) 链表头部添加元素
  • append(item) 链表尾部添加元素
  • insert(pos, item) 指定位置添加元素
  • remove(item) 删除节点
  • search(item) 查找节点是否存在

单链表-链表长度(length)

def length(self):
    """
        链表长度
    :return:
    """
    cur = self.head  # 初始游标
    count = 0
    while cur != None:
        count += 1
        cur = cur.next
    return count

图解说明

单链表长度图解

单链表-链表是否为空(is_empty)

def is_empty(self):
    """
        链表是否为空
    :return:
    """
    flag = False
    if self.head is None:
        flag = True
    return flag

图解说明

单链表是否为空

单链表-遍历链表(traversal)

def traversal(self):
    """
        遍历链表
    :return:
    """
    cur_node = self.head
    while cur_node:
        print(cur_node.val, end=" ")
        cur_node = cur_node.next

图解说明

遍历链表

单链表-链表头部插入元素(add)

def add(self, data):
    """
        头部插入元素
    :param data:
    :return:
    """
    node = LinkListNode(data)
    node.next = self.head
    self.head = node

图解说明

链表头部插入元素

单链表-链表尾部插入元素(append)

def append(self, data):
    """
        尾部插入元素
    :param data:
    :return:
    """
    new_node = LinkListNode(val=data)
    if self.is_empty():
        self.head = new_node
    else:
        cur_node = self.head
        while cur_node.next:
            cur_node = cur_node.next
        cur_node.next = new_node

图解说明

单链表尾部插入元素

单链表-链表指定位置插入元素(insert)

def insert(self, pos, data):
    """
        指定位置插入元素
    :param pos:
    :param data:
    :return:
    """
    if pos <= 0:
        self.add(data)
    elif pos > (self.length() - 1):
        self.append(data)
    else:
        pre = self.head
        count = 0
        while count < (pos - 1):
            count += 1
            pre = pre.next
        node = LinkListNode(data)
        node.next = pre.next
        pre.next = node

图解说明

链表指定位置插入元素

单链表-链表查询元素(search)

 def search(self, data):
     """
         查找元素节点是否存在并返回下标
     :param data:
     :return:
     """
     count = 0
     flag = False
     cur = self.head
     while cur != None:
         if cur.val == data:
             flag = True
             break
         else:
             cur = cur.next
         count += 1
     return flag, count

图解说明

链表查询元素

单链表-链表删除元素(remove)

def remove(self, data):
    """
        移除链表指定元素
    :param data:
    :return:
    """
    cur = self.head
    pre = None
    while cur != None:
        if cur.val == data:
            if cur == self.head:
                self.head = cur.next
            else:
                pre.next = cur.next
            break
        else:
            pre = cur
            cur = cur.next

图解说明

链表删除元素方式1
链表删除元素方式2

单链表-完整代码及测试

# -*- coding:utf-8 -*-

class LinkListNode(object):
    """
        单链表节点类初始化
    """
    def __init__(self, val=None, next=None):
        self.val = val
        self.next = next


class SingleLinkList(object):
    """
        生成链表及链表操作类
    """
    def __init__(self, head=None):
        self.head = head

    def is_empty(self):
        """
            链表是否为空
        :return:
        """
        flag = False
        if self.head is None:
            flag = True
        return flag

    def length(self):
        """
            链表长度
        :return:
        """
        cur = self.head  # 初始游标
        count = 0
        while cur != None:
            count += 1
            cur = cur.next
        return count

    def append(self, data):
        """
            尾部插入元素
        :param data:
        :return:
        """
        new_node = LinkListNode(val=data)
        if self.is_empty():
            self.head = new_node
        else:
            cur_node = self.head
            while cur_node.next:
                cur_node = cur_node.next
            cur_node.next = new_node

    def add(self, data):
        """
            头部插入元素
        :param data:
        :return:
        """
        node = LinkListNode(data)
        node.next = self.head
        self.head = node

    def insert(self, pos, data):
        """
            指定位置插入元素
        :param pos:
        :param data:
        :return:
        """
        if pos <= 0:
            self.add(data)
        elif pos > (self.length() - 1):
            self.append(data)
        else:
            pre = self.head
            count = 0
            while count < (pos - 1):
                count += 1
                pre = pre.next
            node = LinkListNode(data)
            node.next = pre.next
            pre.next = node

    def search(self, data):
        """
            查找元素节点是否存在并返回下标
        :param data:
        :return:
        """
        count = 0
        flag = False
        cur = self.head
        while cur != None:
            if cur.val == data:
                flag = True
                break
            else:
                cur = cur.next
            count += 1
        return flag, count

    def remove(self, data):
        """
            移除链表指定元素
        :param data:
        :return:
        """
        cur = self.head
        pre = None
        while cur != None:
            if cur.val == data:
                if cur == self.head:
                    self.head = cur.next
                else:
                    pre.next = cur.next
                break
            else:
                pre = cur
                cur = cur.next

    def traversal(self):
        """
            遍历链表
        :return:
        """
        cur_node = self.head
        while cur_node:
            print(cur_node.val, end=" ")
            cur_node = cur_node.next


def main():
    node_list = SingleLinkList()
    node_list.append(1)
    node_list.append(2)
    node_list.append(3)
    node_list.add(4)
    node_list.insert(2, 5)
    node_list.search(3)
    node_list.remove(3)
    node_list.traversal()


if __name__ == '__main__':
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值