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

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

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

在单向链表中,我们通过头节点来表示链表的起始位置,而尾节点的下一个引用(`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
    }
}


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

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

目录
相关文章
|
1月前
|
存储
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)(一)
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)
|
1月前
|
存储 算法 安全
HashMap常见面试题(超全面):实现原理、扩容机制、链表何时升级为红黑树、死循环
HashMap常见面试题:红黑树、散列表,HashMap实现原理、扩容机制,HashMap的jd1.7与jdk1.8有什么区别,寻址算法、链表何时升级为红黑树、死循环
|
1月前
|
算法 Java
数据结构与算法学习六:单向环形链表应用实例的约瑟夫环问题
这篇文章通过单向环形链表的应用实例,详细讲解了约瑟夫环问题的解决方案,并提供了Java代码实现。
20 0
|
1月前
|
存储 缓存
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)(二)
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)
|
3月前
|
存储 算法 Python
【面试题】合井K个升序链表
【面试题】合井K个升序链表
35 0
|
3月前
|
存储 Java
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程环境下,HashMap在扩容时如果发生条件竞争,元素的插入顺序可能形成循环链表,导致死循环。
|
3月前
|
存储 JavaScript 前端开发
JavaScript实现单向链表
JavaScript实现单向链表
21 0
|
5月前
|
存储 算法
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
|
5月前
|
算法 C语言
数据结构——单向链表(C语言版)
数据结构——单向链表(C语言版)
45 2