要反转一个链表,可以使用迭代或递归的方式进行操作。
- 迭代法:
- 使用三个指针prev、current和next来记录当前节点的前一个节点、当前节点和下一个节点。
- 初始化时,将prev和next都设为null,current指向链表的头节点。
- 进入循环,每次迭代都执行以下操作:
- 将next指向current的下一个节点,以防止链表断裂。
- 将current的下一个节点指向prev,实现指针的反转。
- 将prev指向current,current指向next。
- 将next指向current的下一个节点之前,需要先保存next的值,以便后续使用。
- 当循环结束时,prev指向原链表的尾节点,即反转后的头节点。
- 返回prev作为新的头节点。
以下是使用迭代法实现链表反转的Java代码示例:
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}
- 递归法:
- 递归反转链表的思路是先递归反转当前节点之后的链表,然后将当前节点的下一个节点的next指针指向当前节点,再将当前节点的next指针设为null,即完成了当前节点的反转。
- 递归的终止条件是当前节点为null或下一个节点为null。
- 在递归过程中,每次递归都返回反转后的链表的头节点。
- 最后返回递归的结果作为新的头节点。
以下是使用递归法实现链表反转的Java代码示例:
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode reversedHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return reversedHead;
}
在递归过程中,先递归反转当前节点之后的链表,然后将当前节点的下一个节点的next指针指向当前节点,最后将当前节点的next指针设为null,即完成了当前节点的反转。
希望这个解答对你有帮助!如果还有其他问题,请随时提问。