现在的位置: 首页 > 综合 > 正文

亚信实习笔试题 单链表倒置

2013年10月01日 ⁄ 综合 ⁄ 共 1327字 ⁄ 字号 评论关闭

这是一道非常经典的题目,很多公司都会考到的。考的时候只知道要用三个指针才行。幸好时间比较充足,仔细分析了一下,还是做出来了。

下面是我的代码。链表假设有头结点。倒置时,保证头结点不被倒置。

#include <iostream>
using namespace std;

typedef struct tagNode {
    
char data;
    
struct tagNode *next;
} Node;

typedef Node* List;

List reverse(List l)
{
    if (l == NULL)
        exit(
0);
    
if (l->next == NULL)
        exit(
0);

    Node *= l->next; // 从头结点的下一个结点开始。
    Node *= p->next;
    Node 
*= 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 *= l;
    
while (p) {
        cout 
<< p->data;
        cout 
<< "---->";
        p 
= p->next;
    }
    cout 
<< "NULL" << endl;
}

List createlist(int n)
{
    List l 
= NULL;
    Node 
*= NULL, *= 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;
}

 

 

抱歉!评论已关闭.