1 题目
题目:翻转链表(Reverse Linked List)
描述:翻转一个链表。
lintcode题号——35,难度——easy
样例1:
输入:链表 = 1->2->3->null
输出:3->2->1->null
解释:翻转链表
样例2:
输入:链表 = 1->2->3->4->null
输出:4->3->2->1->null
解释:翻转链表
2 解决方案
2.1 思路
链表的翻转,把节点翻转前后的指针的指向变化理清就可以了,可以通过画图来分析。
2.2 图解
初始状态:
head
|
null 1 -> 2 -> 3 -> 4 -> null
| |
prev cur
第一次循环完成后:
head
|
null <- 1 2 -> 3 -> 4 -> null
| |
prev cur
第二次循环完成后:
head
|
null <- 1 <- 2 3 -> 4 -> null
| |
prev cur
第三次循环完成后:
head
|
null <- 1 <- 2 <- 3 4 -> null
| |
prev cur
第四次循环完成后:
head
|
null <- 1 <- 2 <- 3 <- 4 null
| |
prev cur
所有循环完成,此时prev指针即指向链表头的位置,返回perv即可表示该新链表:
null <- 1 <- 2 <- 3 <- 4
|
prev
2.3 时间复杂度
时间复杂度为O(n)。
2.4 空间复杂度
空间复杂度为O(1)。
3 源码
细节:
- prev初始值nullptr,cur初始值指针链表头。
- 链表节点指针的四步翻转:保存下一位/反转指针/prev指针后移/cur指针后移
C++版本:
/**
* Definition of singly-linked-list:
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
/**
* @param head: n
* @return: The new head of reversed linked list.
*/
ListNode* reverse(ListNode *head) {
// write your code here
ListNode * prev = nullptr;
ListNode * cur = head;
while (cur != nullptr)
{
// 针对节点指针的四步翻转
ListNode * temp = cur->next; // 保存下一位
cur->next = prev; // 指针反转
prev = cur; // prev后移
cur = temp; // cur后移
}
return prev;
}