用链表生成一个栈

本文介绍了一种使用链表实现栈的数据结构方法,并提供了完整的Java代码示例。文章详细解释了如何进行元素的压栈、出栈及查看栈顶元素等基本操作。

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

package 栈;

 

/**

 * 定义一个结点

 * @author Administrator

 *

 */

class Node{

Node next= null;

int data;

public Node(int data){

this.data = data;

}

}

 

/**

 * 用链表创建一个栈

 * @author Administrator

 *

 */

public class Stack {

Node top = null;

/**

 * 判断链表是否为空

 * @return

 */

public boolean isEmpty(){

return top == null;

}

/**

 * 向栈中添加元素

 */

public void push(int data){

Node node = new Node(data);

node.next = top;

top = node;

}

/**

 * 从栈中取元素

 */

public int pop(){

if(this.isEmpty()){

return (Integer) null;

 }

int data = top.data;

top = top.next;

return data;

}

/**

 * 取栈的峰值

 * @return

 */

public int peek(){

if(this.isEmpty()){

return (Integer) null;

 }

return top.data;

}

/**

 * 返回栈中的元素个数

 * @return

 */

public int size(){

int size = 0;

Node tmp = top;

while(tmp!=null){

size++;

tmp = tmp.next;

}

return size;

}

/**

 * 打印栈

 */

public void printStack(){

Node tmp = top;

while(tmp != null){

System.out.println(tmp.data);

tmp = tmp.next;

}

}

public static void main(String[] args) {

Stack stack = new Stack();

stack.push(2);

stack.push(1);

stack.push(4);

stack.push(5);

stack.push(3);

System.out.println("打印栈:");

stack.printStack();

System.out.println("栈的大小:");

System.out.println(stack.size());;

System.out.println("取出一个元素:");

System.out.println(stack.pop());

}

}

<think>我们被要求用Python实现链表数据结构。根据引用,链表由节点组成,每个节点包含数据域和指向下一个节点的指针域。 我们将定义一个节点类(通常命名为Node),然后通过节点类来构建链表。 在链表中,我们通常需要维护一个头节点(head)来作为链表的起始点。 根据引用[2]和[4]的示例,我们可以这样实现: 节点类:包含数据(val)和指向下一个节点的指针(next)。 链表类:包含一个头节点,以及一些操作链表的方法(如插入、删除、遍历等)。 但是,引用[2]中给出的类名为ArrayList,实际上应该是链表节点(通常叫Node)。而且,他们通过手动连接节点来构建链表。 引用[3]和[4]也说明了链表的基本概念。 因此,我们将按照以下步骤: 1. 定义节点类(Node)。 2. 定义链表类(LinkedList),它包含一个头节点(head)属性,以及一些方法(例如:插入、删除、遍历等)。 但是,用户的问题中并没有要求实现链表类,而是要求实现链表数据结构。我们可以有两种方式: 方式一:只定义节点类,然后通过节点类手动连接节点(如引用[2]所示)。 方式二:定义节点类和链表类,链表类封装了操作链表的方法。 考虑到用户要求“创建一个链表程序”,我们采用方式二,这样更完整。 我们将实现以下基本操作: - 初始化链表(可以初始化为空链表,也可以用一个列表初始化) - 遍历链表 - 在链表末尾添加节点 - 在链表头部添加节点 - 在指定位置插入节点 - 删除节点(按值删除或按位置删除) - 获取链表长度 但是,由于问题中没有具体说明需要哪些操作,我们参考引用[1]中提到了遍历链表的方法,以及引用[2]中构建链表的方式。 我们决定实现一个基本的链表类,包括: 1. 初始化方法(__init__):初始化一个链表,头节点为None。 2. 遍历链表(traverse):从头节点开始依次访问每个节点并打印值。 3. 在尾部添加节点(append):将新节点添加到链表末尾。 4. 在头部添加节点(prepend):将新节点添加到链表头部。 5. 插入节点(insert):在指定位置插入节点(位置从0开始)。 6. 删除节点(delete):删除第一个含有指定值的节点。 7. 获取链表长度(__len__):返回链表中节点的个数。 注意:我们也可以实现按位置删除,但这里为了简单,我们实现按值删除。如果需要按位置删除,可以后续添加。 另外,我们还可以实现一个从列表创建链表的方法,但为了简单,我们可以在初始化时接受一个列表,然后将其转换为链表。 根据引用[2]的代码,节点类定义如下: class Node: def __init__(self, data): self.data = data self.next = None 链表类定义如下: class LinkedList: def __init__(self): self.head = None # 其他方法 但是,为了更友好,我们可以让链表初始化时接受一个列表: def __init__(self, data_list=None): self.head = None if data_list is not None: for data in data_list: self.append(data) 下面我们开始编写代码。注意:我们按照要求,在代码块中使用Python语法,并给出注释。 注意:由于用户要求示例代码,我们将提供一个完整的链表实现,包括上述方法。 另外,我们还需要考虑边界情况,比如空链表等。 代码实现如下:</think>### Python中链表数据结构的实现 链表是一种基础数据结构,由一系列节点(Node)组成,每个节点包含两部分:数据域(存储数据)和指针域(指向下一个节点)。下面我将详细说明在Python中如何实现链表: #### 1. 节点类(Node) ```python class Node: def __init__(self, data): self.data = data # 数据域 self.next = None # 指针域(指向下一个节点) ``` #### 2. 链表类(LinkedList) ```python class LinkedList: def __init__(self): self.head = None # 链表头指针 # 在链表尾部添加节点 def append(self, data): new_node = Node(data) if not self.head: # 空链表 self.head = new_node return current = self.head while current.next: # 遍历到最后一个节点 current = current.next current.next = new_node # 在链表头部添加节点 def prepend(self, data): new_node = Node(data) new_node.next = self.head self.head = new_node # 遍历链表并打印 def traverse(self): current = self.head while current: print(current.data, end=" -> ") current = current.next print("None") # 删除指定值的节点 def delete(self, data): if not self.head: return if self.head.data == data: # 删除头节点 self.head = self.head.next return current = self.head while current.next: if current.next.data == data: current.next = current.next.next return current = current.next # 获取链表长度 def length(self): count = 0 current = self.head while current: count += 1 current = current.next return count ``` #### 3. 使用示例 ```python # 创建链表 linked_list = LinkedList() # 添加元素 linked_list.append(10) linked_list.append(20) linked_list.prepend(5) # 头部添加 # 遍历链表 (输出: 5 -> 10 -> 20 -> None) linked_list.traverse() # 删除元素 linked_list.delete(10) # 再次遍历 (输出: 5 -> 20 -> None) linked_list.traverse() # 获取长度 (输出: 2) print("链表长度:", linked_list.length()) ``` #### 关键特性说明: 1. **动态大小**:链表大小可动态增减,无需预先分配内存 2. **插入/删除高效**:在已知位置插入/删除的时间复杂度为$O(1)$ 3. **内存非连续**:节点在内存中分散存储,通过指针连接 4. **访问效率**:随机访问时间复杂度为$O(n)$,需从头遍历 链表适用于需要频繁插入/删除但随机访问较少的场景,如实现队列、、图邻接表等数据结构[^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值