[206].反转链表

 


题目

反转一个单链表。

示例:

输入: 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;
}

 


算法设计:双指针

初始链表如下:

反转链表如下:

发现结点并没有改变,只是指向完全改过来了。

那我们遍历一次,遍历每个结点的过程中,把每个结点的指向换一个方向即可。

道具:俩个指针 precur

初始:

从第一个结点开始,cur->next = pre 这样指针就反转它的指向,完成第一个结点的反转。

接着,对第二个结点反转:

pre 指向 curcur 指向 nextnext 指向 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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值