欢迎访问宙启技术站
智能推送

使用Java函数翻转单向链表

发布时间:2023-06-25 16:49:09

一、单向链表介绍

单向链表是链表的一种,它由结点组成,每个结点包含两个部分:数据域和指针域。数据域存储节点的数据,指针域存储下一个节点的地址。单向链表的优点是结点之间的存储不必是连续的,可以灵活地分配内存空间。

二、单向链表简单实现

以下是单向链表的简单实现,定义了Node类,并且实现单向链表的创建、插入和遍历操作。

public class Node {
    int data;
    Node next;

    public Node(int data) {
        this.data = data;
    }
}

public class SinglyLinkedList {

    private Node head;

    public void insert(int data) {
        Node node = new Node(data);
        if (head == null) {
            head = node;
        } else {
            Node current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = node;
        }
    }

    public void print() {
        Node current = head;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.next;
        }
    }
}

三、翻转单向链表

翻转单向链表,首先需要找到链表的尾节点,然后从尾节点开始依次向前遍历,将每个节点的next指针指向前一个节点,最后将头节点的next指针指向null。具体步骤如下:

1. 遍历链表,找到尾节点(即next指针为null的节点)。

2. 从尾节点开始向前遍历,将每个节点的next指针指向前一个节点。

3. 将头节点的next指针指向null。

下面是翻转单向链表的实现:

public class SinglyLinkedList {

    private Node head;

    public void insert(int data) {
        Node node = new Node(data);
        if (head == null) {
            head = node;
        } else {
            Node current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = node;
        }
    }

    public void reverse() {
        if (head == null) {
            return;
        }
        Node current = head;
        Node prev = null;
        Node next = null;
        while (current != null) {
            next = current.next;
            current.next = prev;
            prev = current;
            current = next;
        }
        head = prev;
    }

    public void print() {
        Node current = head;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.next;
        }
    }
}

在reverse函数中,我们定义了三个指针prev、current和next,分别表示当前节点的前一个节点、当前节点和下一个节点。在遍历过程中,我们将当前节点的next指针指向前一个节点,然后将三个指针向后移动,最终将头节点指向翻转后的链表。

四、测试代码

为了测试翻转单向链表操作,我们可以写一个main函数,先创建一个单向链表并打印出来,然后调用reverse函数进行翻转,最后再次打印出链表。

public static void main(String[] args) {
    SinglyLinkedList list = new SinglyLinkedList();
    list.insert(1);
    list.insert(2);
    list.insert(3);
    list.insert(4);
    list.insert(5);
    System.out.println("Original List:");
    list.print();
    System.out.println();
    System.out.println("Reversed List:");
    list.reverse();
    list.print();
}

输出结果:

Original List:
1 2 3 4 5 
Reversed List:
5 4 3 2 1 

五、总结

单向链表是一种常见的数据结构,通过遍历链表可以实现插入、删除等操作。在对链表进行操作时,需要注意指针的变化,以免引起错误。翻转单向链表是链表操作中的一个常见问题,它可以通过遍历链表并将每个节点的next指针指向前一个节点,最终将头节点指向翻转后的链表来实现。在实现翻转单向链表时,需要定义多个指针来保存当前节点、前一个节点和下一个节点,并且需要注意代码的鲁棒性,即在链表为空时应该直接返回。