题目
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
思路
本题最简单的方法是用栈。但如果考虑到使空间复杂度最小,可以使用前后双指针法
- 指针
prev
最开始指向nullptr
,curr
指向头指针head,prev始终指向curr的前一个结点 - 使得两个指针不断同步右移直到curr指向最后的
nullptr
,在过程中,不断修改curr
的中的next指针指向,使之指向prev。完成遍历时则完成了反转链表
题解
C++
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *prev = nullptr, *curr = head; /*为使反转后的最后一个元素也是null,因此从空指针开始*/
while(curr){
ListNode *next = curr->next;
curr->next = prev; /*更改指向*/
prev = curr; /*更新prev与curr*/
curr = next;
}
return prev;
}
};
注意点:
- 之所以使得
*prev
初始化为nullptr
、*curr
初始化为head,是为了使得反转链表后,最末元素是nullptr
Java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null, curr = head;
while(curr != null){
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}
复杂度
时间复杂度 | 空间复杂度 |
---|---|
O(n) | O(1) |