链表倒序问题(双向链表的基础运用)

原创 2015年11月20日 23:54:35
#include <stdio.h>
#include <stdlib.h>
struct node
{
    int key;
    struct node *next,*before;//结构中包含前向指针before,后向指针next
};
typedef struct node n;
void main()
{
    int a;
    n *head,*en,*p,*q,*p3,*p4;
    head=(n*)malloc(sizeof(struct node));//头节点
    en=(n*)malloc(sizeof(struct node));//尾节点
    head->next=en;
    en->before=head;
    head->before=NULL;
    en->next=NULL;
    p=(n*)malloc(sizeof(struct node));
    head->next=p;
    p->before=head;
    en->before=p;
    p->next=en;
    while(1)
    {
        scanf("%d",&a);
        if(a)
            {
                p->key=a;
                p->next=q=(n*)malloc(sizeof(struct node));
                q->before=p;
                p=q;
            }
            else
            {
                p->before->next=en;//需要注意此处与en连接的节点并不是最终的p,而是它的前一个节点
                en->before=p->before;
                break;
            }

    }
    p3=head->next;//正序输出:从头节点开始输出
     while(p3->next!=NULL)
    {
        printf("%d ",p3->key);
        p3=p3->next;
    }

    putchar('\n');
     p4=en->before;//翻转输出:从尾节点开始输出
     while(p4->before!=NULL)
    {
        printf("%d ",p4->key);
        p4=p4->before;
    }

    putchar('\n');
}

在链表问题中,会遇到反向输出的问题,而对于反向输出,大部分人会利用辅助节点进行倒换指针然后进行输出,而如此做会使用过多的语句。

而双向链表则是在保持原链表结构不变的前提下,利用链表结构中的前向指针从尾节点向前依次输出直到头节点,

同理,顺序输出时也是如此,即利用后向指针,从头节点向后输出,

从而实现了链表的正向、反向输出,比起单向链表更加的简洁,且容易理解。

但要注意前后节点链接时需要两个指向关系从而使前向、后向通路均畅通无阻。

相关文章推荐

双链表的逆序——C程序设计

题目:创建一个双链表,然后逆置双链表。程序分析:将双链表逆置,即是将双链表中的元素逆置,依次将双链表的结点按照头插法插入到一个新建链表的首位,即可实现双链表元素的逆置代码如下:#include#inc...

双向链表反转

双向链表结构定义如下: struct ListNode { ListNode* pre; int data; ListNode* next; }; 先要实现...

链表常见操作java实现二:反转链表,从尾到头倒序遍历

1.反转链表反转链表在面试中非常常见。例如: 将原链表: 0->1->2->3 反转为新链表: 3->2->1->0 反转链表的一般思路是使用三个指针。其中,一个指针为当前节点,一个指针指向...

单链表逆序

2、 单链表逆序          第二个题目是很经典的“单链表逆序”问题。很多公司的面试题库中都有这道题,有的公司明确题目要求不能使用额外的节点存储空间,有的没有明确说明,但是如果面试者使用了...

C/C++笔试经典——链表倒序

设链表节点为: typedef struct tagListNode{ int data; struct tagListNode* next; }ListNode, *List;...

【链表】C++链表反转、链表逆序打印

题目:C++实现链表逆序打印、链表反转 如何将链表逆序,取决于题目的要求。如果面试官只要求打印,一般不改动链表结构为好,如果要求改变链表的方向,则需要改变结构,再顺序打印。 方法1:只逆序打印,不改变...

单链表倒序

需要将单链表倒序,并输出新的链表 核心代码 Node *next = root->next;root->next = new_root; new_root = root; root =...

单链表逆序(三种方式)

三种方式实现单链表的逆序,分别是头结点插入,对称交换和利用堆栈来实现。三种方式分别是出于空间和时间的考虑来实现的,详见注释。public class LinkedList { class Nod...

典型的几个链表操作-逆序和重排

http://dev.firnow.com/course/3_program/c++/cppjs/20081012/150161.html已知链表的头结点head,写一个函数把这个链表逆序 ( Int...

java实现单链表反转(递归方式)

public class DiGuiFanZhuan { public static void main(String[] args) { Node head = new Node(0)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:链表倒序问题(双向链表的基础运用)
举报原因:
原因补充:

(最多只允许输入30个字)