C++和python实现单链表及其原理

实现单链表及其原理

基本概念

单链表(Singly Linked List)是一种链式存储结构,由一系列节点组成,每个节点包含数据域和一个指向下一个节点的指针域。相比于数组,单链表的插入、删除操作更加方便高效,但是单链表的查询操作效率较低。

C++实现

节点定义

在C++实现中,需要先定义节点(struct Node),包含数据域(data)和指针域(next)。

struct Node {
  int data;
  Node *next;
};

创建操作

创建操作可以分为头插法和尾插法。在头插法中,新节点插入到链表的头部;在尾插法中,新节点插入到链表的尾部。

以头插法为例,具体步骤如下:

  • 创建新节点(newNode);
  • 将newNode的指针域(next)指向原链表的头节点(head);
  • 将头指针(head)指向newNode。
void addNode(Node *&head, int data) {
  Node *newNode = new Node;
  newNode->data = data;
  newNode->next = head;
  head = newNode;
}

查找操作

查找操作可以分为按值查找和按索引查找。按值查找的思路是依次遍历链表的每个节点,直到找到值为目标值的节点。按索引查找的思路是从头节点开始,一直向后遍历指定的次数,直到达到目标节点。

以按值查找为例,具体步骤如下:

  • 从头节点(head)开始遍历链表;
  • 每次遍历时,判断当前节点是否为目标节点,如果是则返回该节点的指针,否则继续遍历;
  • 如果遍历到链表尾部都未找到目标节点,则返回NULL。
Node* searchNode(Node *head, int data) {
  Node *current = head;
  while (current != NULL) {
    if (current->data == data) {
      return current;
    }
    current = current->next;
  }
  return NULL;
}

删除操作

删除操作可以分为按值删除和按索引删除。按值删除的思路是先查找到目标节点,然后将目标节点从链表中删除。按索引删除的思路是先遍历到目标节点的前一个节点,然后将目标节点从链表中删除。

以按值删除为例,具体步骤如下:

  • 先查找到目标节点(targetNode)的前一个节点(preNode);
  • 将preNode的指针域(next)指向targetNode的下一个节点;
  • 释放targetNode的内存。
void deleteNode(Node *&head, int data) {
  Node *preNode = NULL;
  Node *current = head;
  while (current != NULL) {
    if (current->data == data) {
      if (preNode == NULL) {
        head = current->next;
      } else {
        preNode->next = current->next;
      }
      delete current;
      return;
    }
    preNode = current;
    current = current->next;
  }
}

Python实现

节点定义

在Python实现中,需要先定义节点(class Node),包含数据域(data)和指针域(next)。

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None

创建操作

创建操作可以分为头插法和尾插法。与C++实现类似,在头插法中,新节点插入到链表的头部;在尾插法中,新节点插入到链表的尾部。

以尾插法为例,具体步骤如下:

  • 创建新节点(new_node);
  • 遍历链表,找到尾节点;
  • 将尾节点的指针域(next)指向new_node。
def add_node(head, data):
  new_node = Node(data)
  if head is None:
    head = new_node
    return head
  current = head
  while current.next is not None:
    current = current.next
  current.next = new_node
  return head

查找操作

查找操作可以分为按值查找和按索引查找。与C++实现类似,按值查找的思路是依次遍历链表的每个节点,直到找到值为目标值的节点。按索引查找的思路与C++实现类似,不再赘述。

以按值查找为例,具体步骤如下:

  • 从头节点(head)开始遍历链表;
  • 每次遍历时,判断当前节点是否为目标节点,如果是则返回该节点,否则继续遍历;
  • 如果遍历到链表尾部都未找到目标节点,则返回None。
def search_node(head, data):
  current = head
  while current is not None:
    if current.data == data:
      return current
    current = current.next
  return None

删除操作

删除操作可以分为按值删除和按索引删除。与C++实现类似,按值删除的思路是先查找到目标节点,然后将目标节点从链表中删除。按索引删除的思路与C++实现类似,不再赘述。

以按值删除为例,具体步骤如下:

  • 先查找到目标节点(target_node)的前一个节点(pre_node);
  • 将pre_node的指针域(next)指向target_node的下一个节点;
  • 释放target_node的内存。
def delete_node(head, data):
  if head is None:
    return None
  if head.data == data:
    head = head.next
    return head
  pre_node = head
  current = head.next
  while current is not None:
    if current.data == data:
      pre_node.next = current.next
      return head
    pre_node = current
    current = current.next
  return head

示例说明

示例1:C++单链表操作

#include <iostream>
using namespace std;

int main() {
  // 创建头节点
  Node *head = new Node;
  head->data = 1;
  head->next = NULL;

  // 进行添加操作
  addNode(head, 2);
  addNode(head, 3);

  // 进行查找操作
  Node *targetNode = searchNode(head, 2);
  if (targetNode != NULL) {
    cout << "Found the target node, data is " << targetNode->data << endl;
  } else {
    cout << "The target node is not found." << endl;
  }

  // 进行删除操作
  deleteNode(head, 2);

  // 遍历链表
  cout << "The nodes in the linked list: ";
  Node *current = head;
  while (current != NULL) {
    cout << current->data << " ";
    current = current->next;
  }
  cout << endl;

  // 释放内存
  current = head;
  while (current != NULL) {
    Node *temp = current;
    current = current->next;
    delete temp;
  }

  return 0;
}

输出结果为:

Found the target node, data is 2
The nodes in the linked list: 3 1 

示例2:Python单链表操作

# 创建头节点
head = Node(1)

# 进行添加操作
head = add_node(head, 2)
head = add_node(head, 3)

# 进行查找操作
target_node = search_node(head, 2)
if target_node is not None:
  print('Found the target node, data is', target_node.data)
else:
  print('The target node is not found.')

# 进行删除操作
head = delete_node(head, 2)

# 遍历链表
nodes = []
current = head
while current is not None:
  nodes.append(str(current.data))
  current = current.next
print('The nodes in the linked list: ' + ' -> '.join(nodes))

# 释放内存(Python自动管理内存,不需要手动释放)

输出结果为:

Found the target node, data is 2
The nodes in the linked list: 1 -> 3

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++和python实现单链表及其原理 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Java高并发测试框架JCStress详解

    Java高并发测试框架JCStress详解 什么是JCStress? JCStress是一个Java高并发测试框架,用于测试多线程环境下的并发问题。它提供了一套丰富的注解和工具,用于编写和执行并发测试。 安装JCStress 要使用JCStress,需要在项目的构建文件中添加JCStress的依赖。可以通过Maven或Gradle来管理依赖。 示例:在Mav…

    other 2023年10月16日
    00
  • MTK Android平台开发流程

    MTK Android平台开发流程 MTK是一家提供芯片方案的公司,其提供的手机芯片方案被很多手机厂商采用。针对MTK芯片的Android平台开发流程,可以简述为以下几个步骤: 硬件准备 在进行MTK Android平台开发之前,需要准备相应的硬件设备,包括MTK手机、数据线等。同时还需要安装相应的驱动软件,以便电脑可以与MTK手机正常连接。 环境搭建 MT…

    other 2023年6月26日
    00
  • utf8转unicode在线转换

    当然,我可以为您提供有关“Windows grep命令”的完整攻略,以下是详细说明: 什么是Windows grep命令? Windows grep命令是一种文本搜索工具,用于在文件中查找指定的字符串或模式。它可以在Windows命令提示符下使用,也可以在PowerShell中使用。 Windows grep命令的使用攻略 以下是Windows grep命令…

    other 2023年5月7日
    00
  • 浅谈jquery中setinterval()方法

    浅谈jQuery中setInterval()方法 在jQuery中,经常会使用setInterval()方法来执行定时任务。该方法的作用是每隔一定时间执行一次指定的函数。本文将为大家介绍setInterval()方法的基本用法和注意事项。 语法 setInterval()方法的语法如下: setInterval(function, interval) 其中,…

    其他 2023年3月29日
    00
  • css网页制作实用技巧9则

    CSS 网页制作实用技巧9则攻略 本攻略将详细讲解9个实用的 CSS 网页制作技巧,帮助您提升网页设计和开发的效率。以下是每个技巧的详细说明和示例: 技巧1:使用 Flexbox 布局 Flexbox 是一种强大的 CSS 布局模型,可以轻松实现灵活的网页布局。以下是一个使用 Flexbox 布局的示例代码: <div class=\"con…

    other 2023年8月18日
    00
  • Windows 7和XP关机后变自动重启的解决办法

    标题:Windows 7和XP关机后变自动重启的解决办法 在 Windows 7 和 XP 的一些情况下,电脑可能会在关机后自动重启,给用户带来不便。本篇文章将介绍两种解决方法,帮助用户解决这个问题。 方法一:修改电源选项 在 Windows 7 和 XP 中,电源选项中可能存在“自动重启”选项,需要将其关闭才能避免自动重启。具体操作步骤如下: 在桌面上右键…

    other 2023年6月26日
    00
  • java方法16进制转换

    Java方法:16进制转换 在Java编程中,我们经常需要进行各种进制之间的转换。其中,16进制转换是一种常见的需求。在本文中,我们将介绍如何使用Java方法进行16进制转换。 1. 十六进制转换为十进制 Java中可以使用Integer.parseInt()方法将16进制字符串转换为10进制数。 String hex = "1F"; /…

    其他 2023年3月28日
    00
  • python中class类与方法的用法实例详解

    Python中class类与方法的用法实例详解 在Python中,我们可以使用class(类)定义一个对象,包括对象的属性和行为,其中方法是类中最重要的组成部分之一。在本文中,我们将详细讲解Python中class类和方法的用法,并提供两个实例,以便更好地理解它们。 什么是类? 类是一种数据类型,它是一个模板或蓝图,用于创建对象的属性和方法。它是一种组合数据…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部