您的位置:首页 > 其它

如何实现将一个链表逆序?

2016-04-16 15:41 501 查看


如何实现将一个链表逆序?

2008-07-04 22:19:14| 分类: 程序相关|举报|字号 订阅





下载LOFTER我的照片书 |

基本思想:

增加一个辅助指针,以P结点为例 p—>q—>r,我们只需r, q调换下位置就可以了

p=head;

q=p->next; //

while(q!=NULL)

{

temp=q->next; //r

q->next=p; //q—>r 变成了q—>p

p=q; //指针后移

q=temp;

}

这样增加个辅助的指针就行乐

ok 通过编译的代码:

#include <stdio.h>

#include <ctype.h>

#include <stdlib.h>

typedef struct List{

int data;

struct List *next;

}List;

List *list_create(void)

{

struct List *head,*tail,*p;

int e;

head=(List *)malloc(sizeof(List));

tail=head;

printf("\nList Create,input numbers(end of 0):");

scanf("%d",&e);

while(e){

p=(List *)malloc(sizeof(List));

p->data=e;

tail->next=p;

tail=p;

scanf("%d",&e);}

tail->next=NULL;

return head;

}

List *list_reverse(List *head)

{

List *p,*q,*r;

p=head;

q=p->next;

while(q!=NULL)

{

r=q->next;

q->next=p;

p=q;

q=r;

}

head->next=NULL;

head=p;

return head;

}

void main(void)

{

struct List *head,*p;

int d;

head=list_create();

printf("\n");

for(p=head->next;p;p=p->next)

printf("--%d--",p->data);

head=list_reverse(head);

printf("\n");

for(p=head;p->next;p=p->next)

printf("--%d--",p->data);

}

进阶:

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


}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: