问题
反转一个单链表
示例
输入:1->2->3->4->5->NULL
输出:5->4->3->2->1->NULL
思路
如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费
其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表
- 首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null
- 接着把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点;保存这个节点的目的是因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了
- 紧接着,继续移动pre和cur指针
- 最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。此时我们return pre指针就可以了,pre指针就指向了新的头结点
双指针法
public class leetcode_206_1 {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while(curr != null){
ListNode nextTemp = curr.next; // 保存cur的下一个节点,接下来要改变cur->next
curr.next = prev; //翻转
prev = curr;
curr = nextTemp;
}
return prev;
}
}
- 时间复杂度:
- 空间复杂度:
递归法
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
// curr——最后一个节点
ListNode curr = reverseList(head.next);
head.next.next = head;
head.next = null; //没有这一段,代码可能会进入循环
return curr;
}
}
- 时间复杂度:
,n 列表长度
- 空间复杂度:
,递归会使用隐式栈空间,递归深度可能达到 n 层