前言
太久没有练习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 = None
class Solution:
def ReverseList(self , head: ListNode) -> ListNode:
# write code here
pre = None
cur = head
while cur:
# 箭头指向交换
next_node = cur.next
cur.next = pre
# 结点更新
pre, cur = cur, next_node
return 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;
}
};