从尾到头输出链表

来源:互联网 发布:js 将timestamp格式化 编辑:程序博客网 时间:2024/05/08 16:03

欢迎来论坛 http://jobexam.net

【题目】输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下

?
代码
01
02
03
04
05
structListNode
{
    intm_nKey;
    ListNode* m_pNext;
};

【分析】分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。

这道题其实有2个思路。第一,就是首先将链表逆序。第二,就是将链表结点入栈,然后一个一个输出堆栈元素。第一个思路改变了链表的结构。属于质变算法;第二个需要一个堆栈结构,即需要额外的空间。各有优点和缺点。

第一个算法如下:
?
代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
voidprint( Node * pHead );
{
    if(pHead == null)
    {
        printf("no nodes");
        return;
    }
    Node *p = pHead->next;
    while(p != null)
    {
        printf("%d", p->key);
    }
    return;    
}
 
voidinvert_sequence(Node *pHead)
{
    if(pHead == null)
    {
        print(pHead);
        return;
    }
    Node *p  = pHead->next;
    if(p == null)
    {
        print(pHead);
        return;
    }
    elseif( p != null )
    {
        //将链表逆序
        Node *q = p->next;
        while( q != null )
        {
            p->next = q->next;
            pHead->next = q;
            q->next = p;
            q = p->next
        }
         
        //输出链表
        print(pHead);
    }
    return;
}


用堆栈的方法如下:
?
代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
voidinvert_sequence(Node *pHead)
{
    if(pHead == null)
    {
        printf("no nodes");
        return;
    }
    Stack s;
    init(s);
    Node *p = pHead->next;
    //压入堆栈s
    while(p != null)
    {
        push(s,p->data);
        p = p->next;
    }
     
    //从堆栈中输出
    while(!isEmpty(s))
    {
        intdata = pop(s);
        printf("%d ",data);
    }  
}

原创粉丝点击