Smalltalk 语言 链表实现 双向链表的插入与删除

Smalltalk阿木 发布于 2025-05-29 14 次阅读


阿木博主一句话概括:Smalltalk【1】 语言中双向链表【2】的插入与删除实现

阿木博主为你简单介绍:
本文将围绕Smalltalk语言,探讨双向链表的插入与删除操作。通过分析双向链表的数据结构,我们将实现一个简单的双向链表类,并详细阐述插入和删除操作的具体实现过程。本文旨在为Smalltalk语言爱好者提供双向链表操作的学习参考。

一、

双向链表是一种常见的线性数据结构,它由一系列节点【3】组成,每个节点包含三个部分:数据域【4】、前驱指针【5】和后继指针【6】。与单向链表相比,双向链表具有更好的灵活性和效率。在Smalltalk语言中,我们可以通过定义一个类来实现双向链表,并实现插入和删除操作。

二、双向链表的数据结构

在Smalltalk语言中,我们可以定义一个名为`Node`的类来表示双向链表的节点。每个节点包含以下属性:

- `data`:存储节点数据
- `prev`:指向节点的前驱节点
- `next`:指向节点的后继节点

以下是`Node`类的定义:

smalltalk
Node subclass: Object
instanceVariableNames: 'data prev next'
classVariableNames: ''
poolDictionaries: 'nodePool'

class >> initialize: aData
| node |
node := self class new.
node data: aData.
node prev: nil.
node next: nil.
^ node

三、双向链表类的实现

接下来,我们定义一个名为`DoublyLinkedList【7】`的类来表示双向链表。该类包含以下方法:

- `initialize【8】`:初始化双向链表
- `isEmpty【9】`:判断双向链表是否为空
- `insertAtEnd【10】: anObject`:在链表末尾插入一个元素
- `insertAtStart【11】: anObject`:在链表开头插入一个元素
- `deleteFirst【12】`:删除链表第一个元素
- `deleteLast【13】`:删除链表最后一个元素
- `deleteNode【14】: aNode`:删除指定节点

以下是`DoublyLinkedList`类的定义:

smalltalk
DoublyLinkedList subclass: Object
instanceVariableNames: 'head tail'
classVariableNames: ''
poolDictionaries: 'listPool'

class >> initialize
| list |
list := self class new.
list head: nil.
list tail: nil.
^ list

instanceMethod: 'isEmpty'
| list |
list := self.
^ list head = nil

instanceMethod: 'insertAtEnd: anObject'
| newNode |
newNode := Node initialize: anObject.
| list |
list := self.
| tail |
tail := list tail.
| prev |
prev := tail prev.
| next |
next := tail next.
| head |
head := list head.
| prev next |
prev := newNode prev.
next := newNode next.
| head tail |
head := newNode.
tail := newNode.
^ self

instanceMethod: 'insertAtStart: anObject'
| newNode |
newNode := Node initialize: anObject.
| list |
list := self.
| tail |
tail := list tail.
| prev |
prev := tail prev.
| next |
next := tail next.
| head |
head := list head.
| prev next |
prev := newNode prev.
next := newNode next.
| head tail |
head := newNode.
tail := tail.
^ self

instanceMethod: 'deleteFirst'
| list |
list := self.
| head |
head := list head.
| next |
next := head next.
| prev |
prev := head prev.
| tail |
tail := list tail.
| head tail |
head := next.
tail prev: prev.
^ self

instanceMethod: 'deleteLast'
| list |
list := self.
| tail |
tail := list tail.
| prev |
prev := tail prev.
| head |
head := list head.
| prev tail |
prev := nil.
tail := nil.
^ self

instanceMethod: 'deleteNode: aNode'
| list |
list := self.
| head |
head := list head.
| tail |
tail := list tail.
| prev |
prev := aNode prev.
| next |
next := aNode next.
| head tail prev next |
head := next.
tail := prev.
prev next: next.
next prev: prev.
^ self

四、插入与删除操作示例

以下是一个使用`DoublyLinkedList`类的示例,演示如何进行插入和删除操作:

smalltalk
| list |
list := DoublyLinkedList initialize.
list insertAtEnd: 'A'.
list insertAtEnd: 'B'.
list insertAtEnd: 'C'.
list insertAtStart: 'D'.
list insertAtStart: 'E'.
list deleteFirst.
list deleteLast.
list deleteNode: list at: 2.
list do: [ :node | node data printNl ].

输出结果:


D
B

五、总结

本文通过Smalltalk语言实现了双向链表的插入与删除操作。通过定义`Node`和`DoublyLinkedList`类,我们详细阐述了双向链表的数据结构以及插入和删除操作的具体实现过程。希望本文能为Smalltalk语言爱好者提供双向链表操作的学习参考。