Java函数如何实现链表的反转操作?
链表反转是常见的面试题之一。链表是一种数据结构,由一系列的节点组成,在每个节点中存储了一个元素以及指向下一个节点的指针。反转链表即交换链表中相邻的两个节点的指针,使链表头指向原来的尾节点,原来的尾节点变为新的链表头节点。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指针分别向后移动一位。
重复上述过程直到链表反转完成。
最后返回新的链表头节点。
需要注意的是,在遍历时需要注意对指针的赋值顺序,避免链表出现循环。
