链表逆序

题目出处:http://blog.rainbud.net/article/entry20050928-014721
给定一单链表的表头指针和指向其中一个节点的指针,要求以该指针为头将原链表逆序排列,例如:
1. N1->N2->N3->N4->N5->NULL  pHEAD = N1,pSTART = N3,返回N3->N2->N1->N5->N4->NULL
2. N1->N2->N3->N4->N5->NULL  pHEAD = N1,pSTART = N5,返回N5->N4->N3->N2->N1->NULL
3. N1->N2->N3->N4->N5->NULL  pHEAD = N1,pSTART = N1,返回N1->N5->N4->N3->N2->NULL

不允许额外分配存储空间,不允许递归,可以使用临时变量。
思路:先将整个链表逆序,然后再从pSTART后面断开,将那部分接到pHead上。

typedef  struct  Node
{
    
int i;
    Node
* next;
}
Node,  * PNode;

PNode pHead 
=  NULL;

PNode ListReverse(PNode pHead, PNode pStart)
{
    PNode pNode 
= NULL, pCur = pHead, pNext = NULL;
    
while(pCur != NULL)
  
{
        pNext 
= pCur->next;
        pCur
->next = pNode;
        pNode 
= pCur;
        pCur 
= pNext;
    }

    
    pCur 
= pNode;
    
if(pCur == pStart)
        
return pNode;
    
else
{
        
while(pCur->next != pStart)
            pCur 
= pCur->next;
        pCur
->next = NULL;
        pHead
->next = pNode;
        
        
return pStart;        
    }

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值