
What
Brief
This is a standalone Singly Linked List data structure from the data-structure-typed collection. If you wish to access
more data structures or advanced features, you can transition to directly installing the
complete data-structure-typed package
How
install
npm
npm i singly-linked-list-typed --save
yarn
yarn add singly-linked-list-typed
snippet
basic SinglyLinkedList creation and push operation
const list = new SinglyLinkedList([1, 2, 3, 4, 5]);
console.log([...list]);
console.log(list.length);
list.push(6);
console.log(list.length);
console.log([...list]);
SinglyLinkedList pop and shift operations
const list = new SinglyLinkedList<number>([10, 20, 30, 40, 50]);
const last = list.pop();
console.log(last);
const first = list.shift();
console.log(first);
console.log([...list]);
console.log(list.length);
SinglyLinkedList unshift and forward traversal
const list = new SinglyLinkedList<number>([20, 30, 40]);
list.unshift(10);
console.log([...list]);
const second = list.at(1);
console.log(second);
const elements: number[] = [];
for (const item of list) {
elements.push(item);
}
console.log(elements);
console.log(list.length);
SinglyLinkedList filter and map operations
const list = new SinglyLinkedList<number>([1, 2, 3, 4, 5]);
const filtered = list.filter(value => value % 2 === 0);
console.log(filtered.length);
const doubled = list.map(value => value * 2);
console.log(doubled.length);
const sum = list.reduce((acc, value) => acc + value, 0);
console.log(sum);
SinglyLinkedList for sequentially processed data stream
interface LogEntry {
timestamp: number;
level: 'INFO' | 'WARN' | 'ERROR';
message: string;
}
const logStream = new SinglyLinkedList<LogEntry>();
const entries: LogEntry[] = [
{ timestamp: 1000, level: 'INFO', message: 'Server started' },
{ timestamp: 1100, level: 'WARN', message: 'Memory usage high' },
{ timestamp: 1200, level: 'ERROR', message: 'Connection failed' },
{ timestamp: 1300, level: 'INFO', message: 'Connection restored' }
];
for (const entry of entries) {
logStream.push(entry);
}
console.log(logStream.length);
const processedLogs: string[] = [];
for (const log of logStream) {
processedLogs.push(`[${log.level}] ${log.message}`);
}
console.log(processedLogs);
const firstLog = logStream.at(0);
console.log(firstLog?.message);
const removed = logStream.shift();
console.log(removed?.message);
console.log(logStream.length);
console.log(logStream.length);
implementation of a basic text editor
class TextEditor {
private content: SinglyLinkedList<string>;
private cursorIndex: number;
private undoStack: Stack<{ operation: string; data?: any }>;
constructor() {
this.content = new SinglyLinkedList<string>();
this.cursorIndex = 0;
this.undoStack = new Stack<{ operation: string; data?: any }>();
}
insert(char: string) {
this.content.addAt(this.cursorIndex, char);
this.cursorIndex++;
this.undoStack.push({ operation: 'insert', data: { index: this.cursorIndex - 1 } });
}
delete() {
if (this.cursorIndex === 0) return;
const deleted = this.content.deleteAt(this.cursorIndex - 1);
this.cursorIndex--;
this.undoStack.push({ operation: 'delete', data: { index: this.cursorIndex, char: deleted } });
}
moveCursor(index: number) {
this.cursorIndex = Math.max(0, Math.min(index, this.content.length));
}
undo() {
if (this.undoStack.size === 0) return;
const lastAction = this.undoStack.pop();
if (lastAction!.operation === 'insert') {
this.content.deleteAt(lastAction!.data.index);
this.cursorIndex = lastAction!.data.index;
} else if (lastAction!.operation === 'delete') {
this.content.addAt(lastAction!.data.index, lastAction!.data.char);
this.cursorIndex = lastAction!.data.index + 1;
}
}
getText(): string {
return [...this.content].join('');
}
}
const editor = new TextEditor();
editor.insert('H');
editor.insert('e');
editor.insert('l');
editor.insert('l');
editor.insert('o');
console.log(editor.getText());
editor.delete();
console.log(editor.getText());
editor.undo();
console.log(editor.getText());
editor.moveCursor(1);
editor.insert('a');
console.log(editor.getText());
API docs & Examples
API Docs
Live Examples
Examples Repository
Data Structures
| Data Structure |
Unit Test |
Performance Test |
API Docs |
| Singly Linked List |
 |
 |
SinglyLinkedList |
Standard library data structure comparison
| Data Structure Typed |
C++ STL |
java.util |
Python collections |
| SinglyLinkedList<E> |
- |
- |
- |
Benchmark
singly-linked-list
| test name | time taken (ms) | executions per sec | sample deviation |
|---|
| 10,000 push & pop | 212.98 | 4.70 | 0.01 |
| 10,000 insertBefore | 250.68 | 3.99 | 0.01 |
Built-in classic algorithms
| Algorithm |
Function Description |
Iteration Type |
Software Engineering Design Standards
| Principle |
Description |
| Practicality |
Follows ES6 and ESNext standards, offering unified and considerate optional parameters, and simplifies method names. |
| Extensibility |
Adheres to OOP (Object-Oriented Programming) principles, allowing inheritance for all data structures. |
| Modularization |
Includes data structure modularization and independent NPM packages. |
| Efficiency |
All methods provide time and space complexity, comparable to native JS performance. |
| Maintainability |
Follows open-source community development standards, complete documentation, continuous integration, and adheres to TDD (Test-Driven Development) patterns. |
| Testability |
Automated and customized unit testing, performance testing, and integration testing. |
| Portability |
Plans for porting to Java, Python, and C++, currently achieved to 80%. |
| Reusability |
Fully decoupled, minimized side effects, and adheres to OOP. |
| Security |
Carefully designed security for member variables and methods. Read-write separation. Data structure software does not need to consider other security aspects. |
| Scalability |
Data structure software does not involve load issues. |