这是一道非常经典的题目,很多公司都会考到的。考的时候只知道要用三个指针才行。幸好时间比较充足,仔细分析了一下,还是做出来了。
下面是我的代码。链表假设有头结点。倒置时,保证头结点不被倒置。
#include <iostream>
using namespace std;
char data;
struct tagNode *next;
} Node;
exit(0);
if (l->next == NULL)
exit(0);
Node *q = p->next;
Node *r = NULL;
while (q) {
r = q->next;
q ->next = p;
p = q;
q = r;
}
l->next->next = NULL;
l->next = p;
} void printlist(List l)
{
if (l == NULL)
exit(0);
while (p) {
cout << p->data;
cout << "---->";
p = p->next;
}
cout << "NULL" << endl;
}
{
List l = NULL;
Node *p = NULL, *q = NULL;
l = (Node*)malloc(sizeof(Node));
if (!l)
exit(0);
l->data = 'H';
l->next = NULL;
while (n--) {
q = (Node*)malloc(sizeof(Node));
if (!q)
exit(0);
char c;
cin >> c;
q->data = c; // 设置数据域。
q->next = p->next; // 设置链接域。
p->next = q; // 链入结点。
p = q; // 有此句即为顺序插入,无此句即为逆序插入。
}
} int main()
{
List l = createlist(3);
printlist(l);
l = reverse(l);
printlist(l);
return 0;
}
using namespace std;
typedef
struct tagNode {char data;
struct tagNode *next;
} Node;
typedef Node
* List;List reverse(List l)
{
exit(0);
if (l->next == NULL)
exit(0);
Node
*p = l->next; // 从头结点的下一个结点开始。Node *q = p->next;
Node *r = NULL;
while (q) {
r = q->next;
q ->next = p;
p = q;
q = r;
}
l->next->next = NULL;
l->next = p;
return l;
} void printlist(List l)
{
if (l == NULL)
exit(0);
Node
*p = l;while (p) {
cout << p->data;
cout << "---->";
p = p->next;
}
cout << "NULL" << endl;
}
List createlist(
int n){
List l = NULL;
Node *p = NULL, *q = NULL;
// 创建头结点,这样第一个结点的插入就不需要做特殊处理了。
l = (Node*)malloc(sizeof(Node));
if (!l)
exit(0);
l->data = 'H';
l->next = NULL;
p
= l;while (n--) {
q = (Node*)malloc(sizeof(Node));
if (!q)
exit(0);
char c;
cin >> c;
q->data = c; // 设置数据域。
q->next = p->next; // 设置链接域。
p->next = q; // 链入结点。
p = q; // 有此句即为顺序插入,无此句即为逆序插入。
}
return l;
} int main()
{
List l = createlist(3);
printlist(l);
l = reverse(l);
printlist(l);
return 0;
}