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

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

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

基本思想:

增加一个辅助指针,以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;        
  如何实现将一个链表逆序? - 水含笑 - 未语愁眸     }

  如何实现将一个链表逆序? - 水含笑 - 未语愁眸}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值