目录
题目详情
题目解法-双指针
思路:
- 定义两个指针: prepre 和 curcur ;prepre 在前 curcur 在后。
- 每次让 prepre 的 nextnext 指向 curcur ,实现一次局部反转
- 局部反转完成之后,prepre 和 curcur 同时往前移动一个位置
- 循环上述过程,直至 prepre 到达链表尾部
- 时间复杂度:O(n)
- 空间复杂度:O(1)
C++代码
class Solution {
public:
ListNode* reverseList(ListNode* head)
{
//超时用法
// ListNode dummy ;
// dummy.next = head;
// while (head!= NULL and head->next != NULL)
// {
// dummy.next =head->next;
// head->next = head->next->next;
// head->next = dummy.next;
// }
// return dummy.next;
//双指针
ListNode *cur = NULL;
ListNode *pre = head;
while( pre != NULL)
{
ListNode *t = pre->next;
pre->next = cur;
cur = pre;
pre = t;
}
return cur;
}
};
python代码
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
cur = ListNode()
cur= None
pre = head
while pre != None:
# t = ListNode()
t = pre.next #记录pre的下一个
pre.next = cur #将pre的下个反向指回cur
cur = pre #迭代到下一个cur
pre = t #迭代到下个pre
return cur
题目解法-递归
- 使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作 ret
- 此后,每次函数在返回的过程中,让当前结点的下一个结点的 nextnext 指针指向当前节点。
- 同时让当前结点的 nextnext 指针指向 NULLNULL ,从而实现从链表尾部开始的局部反转
- 当递归函数全部出栈后,链表反转完成。
时间复杂度:O(n),假设 nn 是列表的长度,那么时间复杂度为 O(n)。
空间复杂度:O(n),由于使用递归,将会使用隐式栈空间。递归深度可能会达到 n 层。
C++代码
class Solution {
public:
ListNode* reverseList(ListNode* head)
{
//递归
if(head == NULL || head->next == NULL)
{
return head;
}
ListNode * ret = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return ret;
}
};