直接操作链表实现反转
执行过程如下:
定义两个指针cur
和pre
,让指针cur
指向原链表的头部,pre
指向新链表的头部,next
表示待调整的元素,如图,每次将cur
指向的节点接入新链表,即cur.next = pre
,让pre
重新指向新链表的头部即可,即pre = cur
,代码实现如下:
private static ListNode reverseListNode(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
借助虚拟头结点实现链表反转
解题思路
创建一个虚拟头结点preHead
之后将待反转链表中的节点依次接入preHead
的后边,即cur.next = preHead.next; preHead.next = cur;
,即可接入成功
private static ListNode reverseListByPreHead(ListNode head) {
ListNode preHead = new ListNode(-1); // 定义虚拟头节点
ListNode cur = head; // 定义指针指向待反转链表
while (cur != null) {
ListNode next = cur.next; // 暂时存储 cur.next 指向的节点(原)
cur.next = preHead.next; // 调整 cur.next 指向的位置
preHead.next = cur; // 令节点 cur 插入到虚拟头结点的后一位,即反转后真正的头结点
cur = next; // 恢复 cur 指向的位置(原)
}
return preHead.next; // 返回反转后的链表
}
递归实现
解题思路
在递归到最后时,head
指针指向链表中倒数第二个节点,head.next
指向链表中倒数第一个节点,所以head.next.next = head
即可进行反转,为了避免产生环,所以需要将head.next = null
即可
private static ListNode reverseListByRecursion(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode res = reverseListByRecursion(head.next);
head.next.next = head;
head.next = null;
return res;
}
由于本人还在学习中,如果有问题,希望能请各路大佬能够指点一二,😊😊😊