题目出处: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;
}
}
{
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;
}
}