给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

反转链表-206 - 图1

  1. Input: head = [1,2,3,4,5]
  2. Output: [5,4,3,2,1]

示例 2:

反转链表-206 - 图2

  1. Input: head = [1,2]
  2. Output: [2,1]

示例 3:

  1. Input: head = []
  2. Output: []

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 ≤ Node.val ≤ 5000

思路

链表可以选用迭代或递归方式完成反转。本次我们采用迭代的方法完成反转链表。

新建三个指针:prevcurnext,它们分别指向前一个节点当前节点下一个节点。迭代条件是while( next != nullptr ),我们就一直进行反转链表的操作。

反转链表只需要模拟整个过程,推荐在画板上先画出整个过程,然后再编码。

代码

Cpp:

  1. // 4ms, 8MB
  2. /**
  3. * Definition for singly-linked list.
  4. * struct ListNode {
  5. * int val;
  6. * ListNode *next;
  7. * ListNode() : val(0), next(nullptr) {}
  8. * ListNode(int x) : val(x), next(nullptr) {}
  9. * ListNode(int x, ListNode *next) : val(x), next(next) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. ListNode* reverseList(ListNode* head) {
  15. if( head == nullptr ) return nullptr;
  16. ListNode* prev = nullptr;
  17. ListNode* cur = head;
  18. ListNode* next = head->next;
  19. while( next != nullptr ) {
  20. cur->next = prev;
  21. prev = cur;
  22. cur = next;
  23. next = next->next;
  24. }
  25. cur->next = prev;
  26. return cur;
  27. }
  28. };

Rust:

  1. // 0ms, 2.3MB
  2. // Definition for singly-linked list.
  3. // #[derive(PartialEq, Eq, Clone, Debug)]
  4. // pub struct ListNode {
  5. // pub val: i32,
  6. // pub next: Option<Box<ListNode>>
  7. // }
  8. //
  9. // impl ListNode {
  10. // #[inline]
  11. // fn new(val: i32) -> Self {
  12. // ListNode {
  13. // next: None,
  14. // val
  15. // }
  16. // }
  17. // }
  18. impl Solution {
  19. pub fn reverse_list(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
  20. if let None = head {
  21. return None;
  22. }
  23. let mut prev: Option<Box<ListNode>> = None;
  24. let mut curr: Option<Box<ListNode>> = head;
  25. while curr.is_some() {
  26. let mut tmp_node = curr.take().unwrap();
  27. curr = tmp_node.next;
  28. tmp_node.next = prev;
  29. prev = Some(tmp_node);
  30. }
  31. prev
  32. }
  33. }