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日

相关文章

  • Go env命令如何配置go环境变量

    下面是关于如何使用Go env命令配置Go环境变量的完整攻略: 什么是Go env命令? Go env命令是Go语言社区提供的一款命令行工具,它专门用于查看和设置Go语言开发时所需的环境变量,比如GOPATH、GOROOT、GOBIN等等。正常情况下,我们无需手动设置这些环境变量,Go env会自动根据当前系统的设置来获取这些信息。但有时我们会需要手动设置或…

    other 2023年6月27日
    00
  • C++构造函数+复制构造函数+重载等号运算符调用

    我们先从C++的构造函数开始。 构造函数 构造函数是一种特殊的成员函数,用于在对象创建时执行初始化操作。它的名称与类名相同,没有返回类型。 class Person { public: Person(); // 默认构造函数 Person(const char* name, int age); // 带参构造函数 private: char* m_name;…

    other 2023年6月26日
    00
  • Win10周年更新正式版14393.970补丁KB4016635和KB4016637下载地址 附修复内容

    Win10周年更新正式版14393.970补丁KB4016635和KB4016637下载地址 附修复内容攻略 1. 补丁概述 Win10周年更新正式版14393.970补丁是微软发布的一项重要更新,其中包含了两个补丁:KB4016635和KB4016637。这些补丁旨在修复一些已知的问题和漏洞,提高系统的稳定性和安全性。 2. 下载地址 你可以从以下链接下载…

    other 2023年8月5日
    00
  • asm入网小助手卸载

    以下是“asm入网小助手卸载的完整攻略”的详细讲解,过程中包含两个示例说明的标准Markdown格式文本: asm入网小助手卸载的完整攻略 asm入网小助手是一款方便快捷的网络工具,但有时候我们需要卸载它。本文将介绍如何彻底卸asm入网小助手。 1. Windows系统下的卸载 1.1 控制面板卸载 我们可以通过以下步骤在Windows系统下使用控制面板卸载…

    other 2023年5月10日
    00
  • Android用动画显示或隐藏视图

    当在Android应用程序中需要显示或隐藏视图时,可以使用动画来实现平滑的过渡效果。下面是一个完整的攻略,包含了使用动画显示或隐藏视图的步骤和两个示例说明。 步骤1:准备工作 在开始之前,确保你已经设置好了Android开发环境,并且已经创建了一个Android项目。 步骤2:导入动画资源 首先,你需要在res目录下的res/anim文件夹中创建一个XML文…

    other 2023年9月6日
    00
  • 汇编语言中的函数调用参数传递及全局与局部变量与“基址”

    汇编语言中的函数调用参数传递及全局与局部变量与“基址” 在汇编语言中,函数调用参数传递和全局与局部变量的处理是非常重要的。本攻略将详细讲解这些概念,并提供两个示例来说明。 函数调用参数传递 在汇编语言中,函数调用时参数的传递通常通过栈来实现。以下是一个示例,说明了如何在函数调用中传递参数: section .data msg db \"Hello,…

    other 2023年7月29日
    00
  • java8–list转set

    在Java 8中,我们可以使用Stream API来将List转换为Set。以下是Java 8中将List转换为Set的详细攻略: 步骤1:创建List 首先我们需要创建List对象。我们可以使用ArrayList或LinkedList等Java集合类来创建List对象。以下是一个示例: List<String> list = new Array…

    other 2023年5月9日
    00
  • Android权限控制之自定义权限

    Android权限控制是Android开发中很重要的一个方向,涉及到用户数据的保护和应用功能的合理使用。在Android中,权限分为系统权限和普通权限,系统权限包括网络连接、电话、短信、位置、存储等等,普通权限包括摄像头、录音、震动等。虽然系统已经提供了大量的权限,能够满足大部分应用的需求,但是仍然有一些特殊的权限需要我们自定义。 下面是自定义权限的攻略,分…

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