算法—详细讲解单向链表的实现(python)

一、链表

链表是一种物理存储单元上非连续、非顺序的存储结构
数据元素的逻辑顺序通过链表中的指针链接次序实现
链表由一系列节点组成,节点可以在运行时动态生成
每个节点包含两个部分:存储数据元素的数据区、存储下一个节点地址的指针域

每去存储一个数据就去申请一个节点
在这里插入图片描述

二、单向链表特点:

无法根据某一个节点去访问前一个节点
第一个节点为头节点
最后一个节点的指针域为空,称为尾节点

在这里插入图片描述

三、单向链表的实现

在这里插入图片描述
链表头部新增一个节点

1、新建一个节点

    node=Node(data)
    if not self.head:
        # 再让链表的head指向当前node节点
        self.head = node
    else:
        # 先让node指向当前链表中的头节点
        node.next=self.head
        #再让链表的head指向当前node节点
        self.head=node
        #添加节点之后,链表的长度加1
        self._length+=1

在这里插入图片描述

链表尾部新增一个节点

2、新建一个节点node,值为data

    node=Node(data)
    # 找到链表的尾节点
    # 思路:从头节点开始遍历链表中的所有节点
    # 每次判断当前节点的next是否为空
    # 为空这说明当前节点就是尾节点
    # 不为空,通过当前节点的next方法去访问下一个节点,
    if self.head:
        cur=self.head   #将头节点的地址赋给了变量cur
        while cur.next:
            cur=cur.next
        cur.next = node
    else:
        self.head=node
    # 让当前的尾节点的指针指向新建的节点node
    # 链表的长度加1
    self._length+=1

在这里插入图片描述
链表中插入一个新的节点

    if pos<=0:
        self.add(data)
    elif pos>self._length:
        self.append(data)
    else:
        # 1新建一个节点
        node = Node(data)
        # 2找到链表中索引为pos-1的节点
        cur=self.head
        while pos-1:
            cur=cur.next
            pos-=1
        #到这里之后,cur指向的是索引为pos-1的节点
        # 3让node的next指向索引为pos的节点
        node.next=cur.next
        # 4让索引为pos-1的节点的next指向node
        cur.next=node
        # 5链表的长度加1
        self._length+=1

在这里插入图片描述
删除链表中第一个值为data的节点

一、当删除的节点为头节点时:
在这里插入图片描述
二、当删除的节点为非头节点
在这里插入图片描述

	   cur=self.head
       prev=None    #要删除节点的前驱节点
       while cur:
           if cur.data==data:
               #如果前驱节点为空,说明我们要删除的节点是第一个节点
               if not prev:
                   self.head=cur.next
               else:
                   prev.next = cur.next
               self._length-=1
               return 0
           prev=cur
           cur = c

修改链表中指定位置的值

    if 0<pos<self._length:
        cur = self.head
        while pos:
            cur = cur.next
            pos -= 1
        cur.data=data
    else:
        print('输入的范围不符合要求')

在这里插入图片描述
查找链表中是否有节点的值为data

例如:search(4)
		cur = self.head
        while cur:
            if cur.data == data:
                return True
            cur = cur.next
        return False

代码块为:

class Node:

    def __init__(self, data, _next=None):
        self.data = data  # 数据域
        self.next = _next  # 指针域


class SingleLinkList:

    def __init__(self):
        self.head = None  # 链表的的头节点
        self._length = 0  # 链表的长度,链表的元素个数

    def is_empty(self):
        # 判断链表的是否为空
        return self._length==0

    def length(self):
        # 返回链表的长度
        return self._length

    def nodes_list(self):
        # 返回链表中的所有节点的值组成的列表
        res=[]
        cur=self.head
        while cur:
            res.append(cur.data)
            cur=cur.next
        return res


    def add(self, data):
        # 往链表的头部添加一个节点,值为data
        # 新建一个节点
        node=Node(data)
        # 先让node指向当前链表中的头节点
        node.next=self.head
        #再让链表的head指向当前node节点
        self.head=node
        #添加节点之后,链表的长度加1
        self._length+=1

    def append(self, data):
        # 往链表的尾部添加一个节点,值为data
        # 新建一个节点node,值为data
        node=Node(data)
        # 找到链表的尾节点
        # 思路:从头节点开始遍历链表中的所有节点
        # 每次判断当前节点的next是否为空
        # 为空这说明当前节点就是尾节点
        # 不为空,通过当前节点的next方法去访问下一个节点,
        if self.head:
            cur=self.head   #将头节点的地址赋给了变量cur
            while cur.next:
                cur=cur.next
            cur.next = node
        else:
            self.head=node
        # 让当前的尾节点的指针指向新建的节点node
        # 链表的长度加1
        self._length+=1
    def insert(self, pos, data):
        # 往链表的指定位置插入一个节点,值为data
        if pos<=0:
            self.add(data)
        elif pos>self._length:
            self.append(data)
        else:
            # 1新建一个节点
            node = Node(data)
            # 2找到链表中索引为pos-1的节点
            cur=self.head
            while pos-1:
                cur=cur.next
                pos-=1
            #到这里之后,cur指向的是索引为pos-1的节点
            # 3让node的next指向索引为pos的节点
            node.next=cur.next
            # 4让索引为pos-1的节点的next指向node
            cur.next=node
            # 5链表的长度加1
            self._length+=1

    def remove(self, data):
        # 删除链表中第一个值为data的节点
        cur=self.head
        prev=None    #要删除节点的前驱节点
        while cur:
            if cur.data==data:
                #如果前驱节点为空,说明我们要删除的节点是第一个节点
                if not prev:
                    self.head=cur.next
                else:
                    prev.next = cur.next
                self._length-=1
                return 0
            prev=cur
            cur = cur.next
        return -1

    def modify(self, pos,data):
        # 修改链表中指定位置节点的值
        if 0<pos<self._length:
            cur = self.head
            while pos:
                cur = cur.next
                pos -= 1
            cur.data=data
        else:
            print('输入的范围不符合要求')

    def search(self, data):
        # 查找链表中是否有节点的值为data
        cur = self.head
        while cur:
            if cur.data == data:
                return True
            cur = cur.next
        return False

if __name__ == '__main__':
    l1=SingleLinkList()    #新建一个链表类
    print(l1.head,l1.length())
    l1.add(1)
    print(l1.head.data, l1.length())
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
我可以回答你的第一个问题。以下是实现这些功能的代码: ```python class Node: def __init__(self, data=None): self.data = data self.next = None class LinkedList: def __init__(self): self.head = Node() def add(self, data): new_node = Node(data) cur = self.head while cur.next != None: cur = cur.next cur.next = new_node def display(self): elems = [] cur = self.head.next while cur != None: elems.append(cur.data) cur = cur.next print(elems) def reverse(self): prev = None cur = self.head.next while cur != None: next_node = cur.next cur.next = prev prev = cur cur = next_node self.head.next = prev def remove_even(self): cur = self.head.next prev = self.head while cur != None: if cur.data % 2 == 0: prev.next = cur.next cur = cur.next else: prev = cur cur = cur.next def insert_sorted(self, data): new_node = Node(data) cur = self.head.next prev = self.head while cur != None and cur.data < data: prev = cur cur = cur.next new_node.next = cur prev.next = new_node def merge_sorted(self, other): new_list = LinkedList() cur1 = self.head.next cur2 = other.head.next while cur1 != None and cur2 != None: if cur1.data < cur2.data: new_list.add(cur1.data) cur1 = cur1.next else: new_list.add(cur2.data) cur2 = cur2.next while cur1 != None: new_list.add(cur1.data) cur1 = cur1.next while cur2 != None: new_list.add(cur2.data) cur2 = cur2.next return new_list def split_odd_even(self): odd_list = LinkedList() even_list = LinkedList() cur = self.head.next while cur != None: if cur.data % 2 == 0: even_list.add(cur.data) else: odd_list.add(cur.data) cur = cur.next return odd_list, even_list # 测试代码 lst = LinkedList() lst.add(3) lst.add(2) lst.add(4) lst.add(1) lst.display() # [3, 2, 4, 1] lst.reverse() lst.display() # [1, 4, 2, 3] lst.remove_even() lst.display() # [1, 3] lst.insert_sorted(2) lst.insert_sorted(4) lst.insert_sorted(5) lst.display() # [1, 2, 3, 4, 5] lst2 = LinkedList() lst2.add(2) lst2.add(3) lst2.add(6) lst2.add(7) lst2.add(8) lst2.display() # [2, 3, 6, 7, 8] lst3 = lst.merge_sorted(lst2) lst3.display() # [1, 2, 2, 3, 3, 4, 5, 6, 7, 8] odd_list, even_list = lst3.split_odd_even() odd_list.display() # [1, 3, 3, 5, 7] even_list.display() # [2, 2, 4, 6, 8] ``` 你可以根据需要在主函数中调用这些方法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码敲到头发茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值