一、问题描述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
二、分析问题
1、递归法
首先来考虑两个节点的基本情况,假设链表head有两个节点,只需要让head->next->next指向head,head->next指向null,就能完成两个节点的反转,对于多个节点的情况,可以看成第一个节点和后面所有节点两种情况,再将第二部分划成新的两部分,以此类推,一个递归的解法就完成了。
时间复杂度O(n)
空间复杂度O(n)
2、双指针法
定义指针res、next对链表head进行反转操作。
首先next存储head->next,而后head->next指向res,res再存储head的值,此时head可根据next指向下一个节点,持续这一过程直至head为null,完成链表的反转。
时间复杂度O(n)
空间复杂度O(1)
特殊情况
当链表为null,或者只有一个节点时,上述方法也可使用,因此上述算法鲁棒性较好。
三、图解代码
1、递归法

public ListNode reverseList(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode res = reverseList(head.next);
head.next.next = head;
head.next = null;
return res;
}
2、双指针法

public ListNode reverseList(ListNode head) {
ListNode res=null,next=null;
while (head != null){
next = head.next;
head.next = res;
res = head;
head = next;
}
return res;
}
结语
“不积跬步,无以至千里;不积小流,无以成江海。”
共勉!
312

被折叠的 条评论
为什么被折叠?



