给定一单链表的表头指针和指向其中一个节点的指针,要求以该指针为头将原链表逆序
2012-08-05 10:03
417 查看
给定一单链表的表头指针 和指向其中一个节点的指针,要求以该指针为头将原链表逆序排列,例如: N1->N2->N3->N4->N5->NULL pHEAD = N1,pSTART = N3,返回N3->N2->N1->N5->N4->NULL N1->N2->N3->N4->N5->NULL pHEAD = N1,pSTART = N5,返回这个N5->N4->N3->N2->N1->NULL N1->N2->N3->N4->N5->NULL pHEAD = N1,pSTART = N1,返回这个N1->N5->N4->N3->N2->NULL
不允许额外分配存储空间,不允许递归,可以使用临时变量。
#include <stdlib.h>
#include <stdio.h>
struct Node
{
char data;
Node *next;
};
void printlist(Node *node)
{
while (node!=NULL)
{
printf("%c ",node->data);
node=node->next;
}
printf("\n");
}
void reverse(Node *head,Node *newhead)
{
Node *p=head;
Node *q=head;
Node *r=head;
int flag=0;
if(head==newhead)
{
flag=1;
}
q=q->next;
head->next=NULL;
while (q)
{
r=q;
q=q->next;
if(flag==0)
{
r->next=p;
p=r;
}
else
{
if(head->next==NULL)
{
head->next=r;
r->next=NULL;
}
else
{
r->next=head->next;
head->next=r;
}
}
if(flag==0 && r==newhead)
flag=1;
}
//head->next=NULL;
printlist(newhead);
}
void main()
{
Node a,b,c,d,e;
a.data='a';
a.next=&b;
b.data='b';
b.next=&c;
c.data='c';
c.next=&d;
d.data='d';
d.next=&e;
e.data='e';
e.next=NULL;
printlist(&a);
reverse(&a,&a);
}
不允许额外分配存储空间,不允许递归,可以使用临时变量。
#include <stdlib.h>
#include <stdio.h>
struct Node
{
char data;
Node *next;
};
void printlist(Node *node)
{
while (node!=NULL)
{
printf("%c ",node->data);
node=node->next;
}
printf("\n");
}
void reverse(Node *head,Node *newhead)
{
Node *p=head;
Node *q=head;
Node *r=head;
int flag=0;
if(head==newhead)
{
flag=1;
}
q=q->next;
head->next=NULL;
while (q)
{
r=q;
q=q->next;
if(flag==0)
{
r->next=p;
p=r;
}
else
{
if(head->next==NULL)
{
head->next=r;
r->next=NULL;
}
else
{
r->next=head->next;
head->next=r;
}
}
if(flag==0 && r==newhead)
flag=1;
}
//head->next=NULL;
printlist(newhead);
}
void main()
{
Node a,b,c,d,e;
a.data='a';
a.next=&b;
b.data='b';
b.next=&c;
c.data='c';
c.next=&d;
d.data='d';
d.next=&e;
e.data='e';
e.next=NULL;
printlist(&a);
reverse(&a,&a);
}
相关文章推荐
- 一个单向链表,不知道头节点,一个指针指向其中一个节点,问如何删除这个指针指向的节点?
- 有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表?
- 一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个rand指针指向这个链表中的一个随机节点或NULL,现在要求复制一个单链表来实现这个链表,返回复制后的新链表。
- 给定一个单向链表,目前已经有一个指针,指向某一个节点(记作A),现在要删除这个节点A,如何操作。
- 1.01一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?
- 二叉树层序遍历应用:要求将所有结点加上一个m_pNext指针,指向同层右侧的结点,右侧若无结点则指向NULL,写出其中的Connect函数。
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点-----层序遍历的应用题
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head
- 单向链表末尾插入一个节点(指向指针的指针该怎样理解)
- 给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来
- 淘宝笔试题:一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 使用LINUX C实现一个链表,要求:链表节点构成:姓名、分数、下一个节点指针...
- 给定一颗二叉树,以及其中的两个node(地址均非空),要求给出这两个node的一个公共父节点,使得这个父节点与两个节点的路径之和最小。
- 面试题 单向链表(无头结点)一个指针指向其中的一个结点,如何删除这个结点?
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 淘宝笔试题:一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL