题目描述
题干:
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
题解思路
反转单链表,又是个链表的经典题目,当时学到的最棒的方法就是头插法,这里就是没有头结点的情况,比有头结点的复杂些
就是新定义一个节点不断循环代替原来链表的元素,使得重新得到一条新的反转链表,还得自己画出图来就容易理解了
至于递归写法,链表这个结构就很适合递归方法,因为它很符合递归三要素:
1. 大问题可以拆成俩个子问题
2. 子问题求解方法与大问题相同
3. 存在最小的子问题
但是递归代码我觉得十分晦涩难懂,精选有视频讲解的大佬的题解,可以去观摩学习一下
正确代码
//头插法迭代
public static ListNode reverseList1(ListNode head){
ListNode newHead = null;
ListNode curr = head;
while (curr != null){
ListNode next = curr.next;
curr.next = newHead;
newHead = curr;
curr = next;
}
return newHead;
}
//递归
public static ListNode reverseList2(ListNode head){
if (head == null || head.next == null){
return head;
}
ListNode newHead = reverseList2(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
总结
其实到最后递归的方法我也太明白,我实在不知道那个next到底指的是谁,果然我还停留在斐波那契函数的水平,但我下次遇到一定就会理解了
如果文章存在问题或者有更好的题解,欢迎大牛在评论区斧正和评论出来,各自努力,你我最高处见