反转链表

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

      为了正确发转一个链表,需要调整链表中指针的方向。
      如下图(a)如果把2结点next指针直接指向1结点,会造成链表断琏。所以我们需要调整next指针之前,把2结点的next指针指向的3结点保留下来。也就是说我们在调整结点2的next指针时,除了需要知道结点2本身之外,还需要2的前一个结点1,因为我们需要把结点2的next指针指向1。同时保存结点2的后一个结点3,防止结点断开。
      如图b,我们需要3个指针,一个指向当前结点,一个指向当前结点的前一个结点,一个指向当前结点的后一个结点。
      

思路:

(1)nextNode先指向当前结点下一个结点
(2)pNode指向的结点的next指针指向前一个结点
(3)preNode 指针和pNode指针往前移一位

代码稳定性:

 考虑三种情况: 
(1)输入链表为空
(2)链表只有一个结点
(3)链表有多个结点

代码:

struct node
{
	int value;
	node* next;
};

/*实现链表反向
 *输入:链表头节点
 *输出:反向后的链表头节点,或者null(链表为空的时候),或者头结点(链表只有一个结点的时候)
*/
node* reserveList(node* head)
{
    node* preNode=NULL;
	node* pNode=head;
	while(pNode!=NULL)
	{
		if(pNode->next==NULL)return pNode;
		//实现反转
		node* nextNode=pNode->next;
		pNode->next=preNode;
		//往前移
		preNode=pNode;
		pNode=nextNode;
		
	}
	return  preNode;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值