题目
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
函数原型
C
的函数原型:
struct ListNode* reverseList(struct ListNode* head){}
边界判断
struct ListNode* reverseList(struct ListNode* head){
if( head == NULL )
return NULL;
}
算法设计:双指针
初始链表如下:
反转链表如下:
发现结点并没有改变,只是指向完全改过来了。
那我们遍历一次,遍历每个结点的过程中,把每个结点的指向换一个方向即可。
道具:俩个指针 pre
、cur
。
初始:
从第一个结点开始,cur->next = pre
这样指针就反转它的指向,完成第一个结点的反转。
接着,对第二个结点反转:
pre
指向 cur
,cur
指向 next
,next
指向 cur->next
,就从第一个结点移动到第二个结点了。
cur -> next = pre
这样指针就反转它的指向。
总结一下:
- 创建双指针
- 反转当前结点的指向
- 交换位置
struct ListNode* reverseList(struct ListNode* head){
if( head == NULL )
return NULL;
struct ListNode* pre = NULL;
struct ListNode* cur = head;
// 先创建俩个指针
while( cur != NULL ){
struct ListNode* next = cur->next;
cur->next = pre; // 反转指向
pre = cur;
cur = next;
}
return pre;
}
- 时间复杂度: Θ ( n ) \Theta(n) Θ(n)
- 空间复杂度: Θ ( 1 ) \Theta(1) Θ(1)