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

Java函数如何实现链表的反转操作?

发布时间:2023-05-19 02:33:01

链表反转是常见的面试题之一。链表是一种数据结构,由一系列的节点组成,在每个节点中存储了一个元素以及指向下一个节点的指针。反转链表即交换链表中相邻的两个节点的指针,使链表头指向原来的尾节点,原来的尾节点变为新的链表头节点。Java函数可以通过递归和迭代两种方式实现链表的反转操作。

1. 递归实现链表反转

递归实现链表反转是一种自上而下的思路,我们可以先处理链表的部分,再进一步解决链表的更大部分。对于给定的链表,我们首先将链表头节点的下一个节点指向处理后的剩余链表。然后将处理后的链表头节点指向原来的链表尾节点,交换链表中相邻的两个节点即可。递归的终止条件为链表为空或链表只有一个节点。

具体实现如下:

public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode p = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return p;
}

在该函数中,首先判断链表的头节点是否为空或者链表只有一个节点,如果是,则直接返回原链表。否则进行下一步操作。

调用函数本身对链表的剩余部分进行反转操作,返回的链表头节点将变成新链表的尾节点。

接下来交换链表中的相邻节点,最后返回新的链表头节点。

需要注意的是,在函数的最后将head节点指向null,避免构成环。

2. 迭代实现链表反转

迭代实现链表反转是一种自下而上的思路,我们可以遍历链表,并且反转相邻节点的指针。对于给定的链表,我们需要维护一个指针pre、cur和next。pre指向反转后的链表尾节点,cur指向当前节点,next指向当前节点的后一个节点。首先将当前节点的指针指向pre,然后将pre指针移动到cur位置,将cur指针移动到next位置,再将next指针指向下一个节点,重复这个过程直到链表反转完成。

具体实现如下:

public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode pre = null;
    ListNode cur = head;
    ListNode next = null;
    while (cur != null) {
        next = cur.next;
        cur.next = pre;
        pre = cur;
        cur = next;
    }
    return pre;
}

在该函数中,首先判断链表的头节点是否为空或者链表只有一个节点,如果是,则直接返回原链表。否则进行下一步操作。

维护pre、cur和next指针,将cur指针指向pre位置,再将pre、cur和next指针分别向后移动一位。

重复上述过程直到链表反转完成。

最后返回新的链表头节点。

需要注意的是,在遍历时需要注意对指针的赋值顺序,避免链表出现循环。