ms的将链表逆序的笔试题

题目出处: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后面断开。我是把它分成两个部分,即包括pSTART的前面部分和不包括pSTART的后面部分。当pSTART和pHEAD重合时,前面一部分只有一个节点;当pSTART是链表的尾节点的时候,后面一部分是空链表。分别逆序完了以后,再连接起来。

前面有道题说了,使用pHead和两个临时变量就可以将一个链表逆序,我这里没有使用phead,所以用到了三个临时变量。里面用的临时变量比较多,思路不太清晰。

#i nclude < iostream >
#i nclude
< string >
using namespace std;

struct Node
{

     char name[ 3 ];
    Node
* next;
    Node(
const char * p)
    {
        strcpy(name,p);
        next
= 0 ;
    }
};


// 将某个链表逆序
void ReserseList(Node *& pHead, Node *& pTail)
{
    Node
* p1 = pHead;
     if (p1 == 0 ) // 首指针为空,表示空链表
{
        pTail
= 0 ;
         return ;
    }

    Node
* p2 = p1 -> next;
     if (p2 == 0 ) // 首指针的下一个节点为空,表示只有一个节点
{
        pTail
= 0 ;
         return ;
    }


     // 至少有两个不为空的节点
Node * p3 = 0 ;
     while (p2 != 0 )
    {
        p3
= p2 -> next;
        p2
-> next = p1;
        p1
= p2;
        p2
= p3;
        p3
= 0 ;
    }
    pHead
-> next = 0 ; // 将首节点的next置为0,否则会形成循环链表
pTail = pHead;
    pHead
= p1;
}


// 分成两个链表,然后再合并
Node * Reserse(Node * pHEAD, Node * pSTART)
{
    Node
* ptmp1 = pHEAD, * ptmp2 = pSTART;

     // 将两表拆开
Node * pHead2 = pSTART -> next;
    pSTART
-> next = 0 ;

    ReserseList(ptmp1,ptmp2);
// 逆序前面一部分
Node * ptmp3 = 0 ;

    ReserseList(pHead2,ptmp3);
// 逆序后面一部分

     // 合并
if (ptmp2 == 0 ) // 前面一部分只有一个节点
ptmp1 -> next = pHead2;
     else // 前面一部分有一个以上的节点
ptmp2 -> next = pHead2;
     return ptmp1;
}


void output(Node * tmp)
{

     while (tmp != 0 )
    {
        cout
<< tmp -> name << " -> " ;
        tmp
= tmp -> next;
    }
    cout
<< " NULL " << endl;
}


int main()
{
    Node
* pHEAD = new Node( " N1 " );
    Node
* p2 = new Node( " N2 " );
    Node
* p3 = new Node( " N3 " );
    Node
* p4 = new Node( " N4 " );
    Node
* p5 = new Node( " N5 " );
    pHEAD
-> next = p2;
    p2
-> next = p3;
    p3
-> next = p4;
    p4
-> next = p5;

    output(pHEAD);
    Node
* result = Reserse(pHEAD,p4);
    output(result);

    getchar();

     return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值