top 1.链表反转
与其仰望星空,不如做一个摘星人
1.问题描述
给定链表的头结点head,要求反转链表,并且返回反转后的链表。
示例 1:
输入:head=[1,2,3,4,5,6,7]
输出:[7,6,5,4,3,2,1]
示例 2:
输入:head=[1,2,3]
输出:[3,2,1]
2.思路分析:
此题的目的是反转整个链表,并返回反转后的链表,思路是:链表中元素结点位置不动,只要将当前结点指向下一个结点的指针指向当前结点的前一个结点。
3.详细代码及注释:
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null) {
return head;
}
ListNode node = head;
ListNode prev = null;// 用于当作每个节点的前一个节点
while (node != null) {
ListNode next = node.next;// 先存储每个节点的下一个节点
node.next = prev; // 将指针指向前一个节点
prev = node; // 将当前节点作为下一个节点的前置节点
node = next;// 往后移
}
return prev;
}
}
详细步骤:
- 创建链表。
- 创建一个结点作为每个结点的前一个结点。
- 先存储每个结点的下一个结点
- 将原来指向下一个结点的指针指向它的前一个结点。
- 遍历迭代链表。
- 返回反转后的链表。
3.时间复杂度及空间复杂度:
因为反转过程中要遍历一遍链表,所以时间复杂度为O(n),其中n是链表的长度。
空间复杂度:O(1)。
4.总结:
这道题的思路就是将原来指向下一个结点的指针指向它的前一个结点,在这之前,先存储当前结点的下一个结点,防止数据丢失。
持续更新面试热题,数据结构与算法分析,计算机网络,计算机操作系统,数据库,计算机组成原理,记录学习成长过程。共勉,加油!陌生人。