206 翻转链表
LeetCode
描述:
思路:
- 此题是链表的基础概念的考察, 将其翻转, 最简单暴力的方法就是创建新链表, 遍历就链表.
- 但这种方法通常是没必要的, 根据链表的含义, 通过改变每个链表元素的指针域的指向, 就可以将链表翻转.
- 判断输入头指针为空的情况
- 初始化元素, 保存临时遍历元素:
ListNode *temp, 当前遍历元素: ListNode *cur = head, 当前遍历元素的前一个元素: ListNode *pre = nullptr(初始情况当前元素为头元素, 反转后头元素为最后一个元素, 其指针域指向nullptr)
- 遍历链表, 当前遍历元素不为空进行遍历
- temp保存当前遍历元素的所指向的下一个元素 (
temp = cur -> next)
- 令当前元素cur的指针域指向前一个元素pre (
cur -> next = pre)
- 步骤5, 进行了交换操作, 此时, 在开始下一次遍历时, 需要进行遍历更新操作, 下一次"当前遍历元素"
cur变为下一个(即temp), 下一次"当前遍历元素的前一个元素"pre即为现在的cur. (pre = cur; cur = temp)
- 遍历结束, 返回pre.
代码:
class Solution
{
public:
ListNode *reverseList(ListNode *head)
{
if (head == nullptr || head->next == nullptr)
{
return head;
}
ListNode *temp;
ListNode *cur = head;
ListNode *pre = nullptr;
while (cur != nullptr)
{
temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
};
参考:
代码随想录