面试题-手写一个单向链表

简介: 面试题-手写一个单向链表

单向链表是一种常用的数据结构,它由一系列节点组成,每个节点都包含两部分内容:数据和指向下一个节点的引用。每个节点都只知道下一个节点的位置,而不知道前一个节点的位置,因此称为单向链表。

在单向链表中,我们通过头节点来表示链表的起始位置,而尾节点的下一个引用(`next`)指向 `null`,表示链表的结束。通过修改节点之间的引用关系,我们可以实现插入、删除和遍历链表的操作。

单向链表的插入操作分为两种情况:

1. 插入到链表的头部,即在头节点前插入新节点。此时,我们创建一个新节点,并将它的 `next` 引用指向原来的头节点,然后将头节点指向新节点,完成插入操作。

2. 插入到链表的中间或尾部,即在某个节点之后插入新节点。首先,我们需要找到目标节点的位置,然后创建一个新节点,并将它的 `next` 引用指向目标节点的下一个节点,然后将目标节点的 `next` 引用指向新节点,完成插入操作。

单向链表的删除操作也分为两种情况:

1. 删除头节点,即删除链表的第一个节点。我们只需要将头节点的 `next` 引用指向头节点的下一个节点,即可删除头节点。

2. 删除其他节点,需要先找到目标节点和它的前驱节点。然后,将前驱节点的 `next` 引用指向目标节点的下一个节点,即可删除目标节点。

当遍历链表时,我们可以从头节点开始,依次访问每个节点,并按顺序输出节点的数据。

这就是单向链表的基本原理。通过修改节点之间的引用关系,我们可以灵活地插入、删除和遍历链表中的数据。

以下是一个基于 Java 的简单单向链表的示例代码:

class Node {
    int data;
    Node next;
    public Node(int data) {
        this.data = data;
        this.next = null;
    }
}
class LinkedList {
    Node head;
    public void insertAtBeginning(int data) {
        Node newNode = new Node(data);
        newNode.next = head;
        head = newNode;
    }
    public void insertAtEnd(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
        } else {
            Node current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
        }
    }
    public void deleteNode(int data) {
        if (head == null) {
            return;
        }
        if (head.data == data) {
            head = head.next;
        } else {
            Node current = head;
            Node prev = null;
            while (current != null && current.data != data) {
                prev = current;
                current = current.next;
            }
            if (current != null) {
                prev.next = current.next;
            }
        }
    }
    public void display() {
        Node current = head;
        while (current != null) {
            System.out.print(current.data + " -> ");
            current = current.next;
        }
        System.out.println("null");
    }
}
// 测试链表的实现
public class Main {
    public static void main(String[] args) {
        LinkedList list = new LinkedList();
        list.insertAtBeginning(3);
        list.insertAtBeginning(2);
        list.insertAtBeginning(1);
        list.insertAtEnd(4);
        list.insertAtEnd(5);
        list.display(); // Output: 1 -> 2 -> 3 -> 4 -> 5 -> null
        list.deleteNode(3);
        list.display(); // Output: 1 -> 2 -> 4 -> 5 -> null
    }
}


以上代码实现了一个简单的单向链表,包含了在链表头部和尾部插入节点、删除指定节点、以及打印链表的功能。

如有任何疑问,请随时提问。

目录
相关文章
|
10天前
|
存储 算法 Python
【面试题】合井K个升序链表
【面试题】合井K个升序链表
17 0
|
10天前
|
存储 Java
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程环境下,HashMap在扩容时如果发生条件竞争,元素的插入顺序可能形成循环链表,导致死循环。
|
19天前
|
存储 JavaScript 前端开发
JavaScript实现单向链表
JavaScript实现单向链表
13 0
|
3月前
|
存储 算法
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
|
3月前
|
算法 C语言
数据结构——单向链表(C语言版)
数据结构——单向链表(C语言版)
33 2
|
3月前
|
Java
单向环形链表-约瑟夫问题(java)
单向环形链表-约瑟夫问题(java)
15 0
|
3月前
|
存储 算法 前端开发
【C/数据结构与算法】:链表的实现(单向链表+双向链表)
【C/数据结构与算法】:链表的实现(单向链表+双向链表)
19 0
【循环链表】数据结构——单向循环链表和双向循环链表操作&笔记
【循环链表】数据结构——单向循环链表和双向循环链表操作&笔记
|
4月前
|
算法 测试技术
【数据结构与算法 | 基础篇】单向循环链表实现队列
【数据结构与算法 | 基础篇】单向循环链表实现队列
下一篇
云函数