前言
太久没有练习C++和Java,基本忘完了…还有数据结构也不太熟悉了。借此机会回顾一下相关的知识点,也为之后做准备吧。
题目内容
思路
- 要求时间复杂度为O(n),那么只能遍历一次。
- 反转的话,只需要将链表箭头指向换个方向就行。
- 遍历每个节点,假设当前结点是 c u r cur cur,前导结点是 p r e pre pre,因为需要将 c u r cur cur 的箭头指向 p r e pre pre,所以引入了 p r e pre pre 这个变量。
- 循环过程需要四步:
- 临时保存 c u r . n e x t cur.next cur.next(因为要将 c u r . n e x t cur.next cur.next更改成 p r e pre pre,即变换指向,所以 c u r cur cur 原来的指向得临时保存): n e x t _ n o d e = c u r . n e x t next\_node = cur.next next_node=cur.next
- 更改 c u r . n e x t cur.next cur.next,使其指向 p r e pre pre: c u r . n e x t = p r e cur.next = pre cur.next=pre
- 更新 p r e pre pre 和 c u r cur cur: p r e , c u r = c u r , n e x t _ n o d e pre, cur = cur, next\_node pre,cur=cur,next_node
代码
- Python
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution:def ReverseList(self , head: ListNode) -> ListNode:# write code herepre = Nonecur = headwhile cur:# 箭头指向交换next_node = cur.nextcur.next = pre# 结点更新pre, cur = cur, next_nodereturn pre
- C++
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(nullptr) {}
};class Solution {public:ListNode* ReverseList(ListNode* head) { ListNode* pre = nullptr;ListNode* cur = head;while(cur != nullptr){ListNode* tmp = cur->next;cur->next = pre;pre = cur;cur = tmp;}return pre;}
};