Python 单链表的初始化、赋值、输出

本文详细介绍了如何使用Python实现单链表数据结构,包括结点类和链表类的定义,以及插入数据和打印链表的方法。通过具体示例展示了如何初始化链表并进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定义一个结点类

valnext
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

2.定义单链表 :(单链表是由一个一个结点构成)在结点类的基础上

class LinkList:
#新建一个头指针为空的链表

    def __init__(self):
        self.head=None
#将数据插入链表:
(这里必须要说的是最后返回链表的头指针)
    def initList(self, data):
        # 创建头结点
        self.head = ListNode(data[0])
        r=self.head
        p = self.head
        # 逐个为 data 内的数据创建结点, 建立链表
        for i in data[1:]:
            node = ListNode(i)
            p.next = node
            p = p.next
        return r
    def printlist(self,head):
        if head == None: return
        node = head
        while node != None:
            print(node.val,end='')
            node = node.next

 

完整代码:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class LinkList:
    def __init__(self):
        self.head=None

    def initList(self, data):
        # 创建头结点
        self.head = ListNode(data[0])
        r=self.head
        p = self.head
        # 逐个为 data 内的数据创建结点, 建立链表
        for i in data[1:]:
            node = ListNode(i)
            p.next = node
            p = p.next
        return r
    def printlist(self,head):
        if head == None: return
        node = head
        while node != None:
            print(node.val,end='')
            node = node.next
if __name__ == '__main__':
    l=LinkList()
    data1 = [1, 2, 3]
    data2= [2, 4, 6]
    l1=l.initList(data1)
    l2=l.initList(data2)
    l.printlist(l1)

 

<think>嗯,用户想了解如何定义和初始化常见的数据结构,比如数组、链表、栈这些。首先我得回忆一下这些数据结构的基本概念,然后考虑不同编程语言中的实现方式。用户可能对具体的代码示例感兴趣,所以需要给出不同语言的例子,比如Python、C或者Java。 数组的话,应该先说明它是一组连续内存空间存储相同类型元素的结构。初始化的时候需要指定大小或者直接赋值元素。比如在Python中是列表,但实际数组可能更严格,比如用array模块或者numpy。不过通常用列表来示例也可以。C语言中的数组定义需要类型和大小,而Java则是声明类型和new关键字。 接下来是链表。链表分为单链表和双向链表等。每个节点包含数据和指向下一个节点的指针。初始化链表通常需要定义节点结构,然后创建节点并连接它们。比如在Python中可以用类来定义节点,然后逐个创建。C语言中用结构体,Java也是类似的类定义。需要注意的是,链表的头指针是关键,引用[3]提到只需要头指针就能操作整个链表,所以初始化时要正确设置头指针。 然后是栈,栈是后进先出的结构,可以用数组或链表实现。初始化栈需要维护一个存储元素的容器和栈顶指针。数组实现的栈可能有容量限制,而链表实现的可以动态扩展。Python中可以用列表的append和pop方法简单实现栈。C语言需要自己管理数组和栈顶索引,Java可以使用Stack类或者LinkedList。 还要考虑不同数据结构的特点和应用场景,比如引用[1]和引用[2]提到链表适合动态数据,而数组在CPU缓存中更高效。这时候在定义和初始化的时候可能需要根据场景选择合适的数据结构。 用户可能还会想知道初始化的具体步骤,比如是否需要预先分配空间,或者如何动态调整大小。比如链表的初始化可能只是创建一个空头节点,而数组初始化可能需要固定大小或者动态数组。 另外,代码示例的准确性很重要。比如在Python中链表的实现是否正确,是否考虑了节点连接。在栈的实现中,是否需要处理栈空的情况,比如pop操作时的异常处理。 可能还需要对比不同数据结构的初始化差异,比如数组需要连续内存,而链表是分散的节点。初始化链表时更灵活,但需要更多的内存操作。 最后要确保回答结构清晰,分点说明每个数据结构的定义和初始化方法,并给出多语言的示例。同时,根据用户提供的引用资料,适当引用相关内容,比如链表只需要头指针,数组在内存管理的优势等。</think>### 数据结构定义与初始化详解 #### 一、数组(Array) **定义**:数组是连续内存空间中存储相同类型元素的线性结构,支持随机访问[^2] **初始化方法**(不同语言实现): ```python # Python列表(动态数组) arr = [1, 2, 3, 5] # 直接初始化 empty_arr = [] # 空数组 ``` ```c // C语言固定长度数组 int arr[4] = {1, 2, 3, 5}; int empty_arr[10]; // 声明未初始化的数组 ``` ```java // Java数组 int[] arr = new int[]{1, 2, 3, 5}; int[] emptyArr = new int[10]; // 初始化为默认值0 ``` #### 二、链表(Linked List) **定义**:通过指针连接的非连续节点组成的线性结构,分为单向/双向链表[^1] **初始化步骤**: 1. 定义节点结构 2. 创建头节点 3. 链接后续节点 ```python # Python单链表初始化 class Node: def __init__(self, data): self.data = data self.next = None head = Node(1) # 头节点 second = Node(2) head.next = second # 节点连接 ``` ```c // C语言单链表 struct Node { int data; struct Node* next; }; struct Node* head = (struct Node*)malloc(sizeof(struct Node)); head->data = 1; head->next = NULL; // 初始化为空链表 ``` #### 三、栈(Stack) **定义**:后进先出(LIFO)的线性结构,核心操作是push/pop[^1] **初始化方法**: ```python # Python列表实现栈 stack = [] # 空栈初始化 stack.append(5) # push操作 stack.append(8) top = stack.pop() # pop操作 ``` ```java // Java Stack类 import java.util.Stack; Stack<Integer> stack = new Stack<>(); stack.push(5); // 初始化后直接使用 ``` ```c // C语言数组实现栈 #define MAX_SIZE 100 int stack[MAX_SIZE]; int top = -1; // 初始化栈顶指针 void push(int value) { if(top < MAX_SIZE-1) { stack[++top] = value; } } ``` ### 关键差异对比表 | 数据结构 | 存储方式 | 初始化复杂度 | 适用场景 | |----------|----------------|--------------|------------------------| | 数组 | 连续内存 | O(1) | 随机访问、CPU缓存优化 | | 链表 | 非连续节点 | O(n) | 动态插入删除[^1] | | 栈 | 数组/链表实现 | O(1) | 函数调用、撤销操作 |
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值