链表的倒序函数设计

今天下午去一家公司去面试,他们面试题中设计出了我从没涉及的C语言链表的问题,我想了很久脑子有了概念,却没有计算机、

没有办法进行实践操作,无奈写了一黑板的辅助图,最终还是放弃了。原因是:这是一家中介公司,说是如果觉得我们能力够直接推荐的,不行就要进行培训,说是100%就业。无论题目做的再好还是需要你付出一定的,前两个同学已经摇头走了、我对这个题目感兴趣于是我拍下了这张照片也走了。


#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

//定义链表中的节点
typedef struct NODE
{
        int member; //节点中的成员 
        struct NODE *pNext; //指向下一个节点的指针 
}_NODE,*pNODE;
void Intel(struct NODE *Pointer);
int main()
{
     //定义12个节点组成一个链表
    struct NODE A,B,C,D,E,F,G,H,I,J,K,L;
     //为每一个节点设定逻辑关系 说明每一个链表下一个是谁 
    A.pNext = &B;B.pNext = &C;C.pNext = &D;
    D.pNext = &E;E.pNext = &F;F.pNext = &G;
    G.pNext = &H;H.pNext = &I;I.pNext = &J;
    J.pNext = &K;K.pNext = &L;L.pNext = NULL;
    
    struct NODE *pHead = &A; //设定头指针  声明链表的头是谁 
    
    struct NODE *pPointer; //设定数据结构操作指针 
    int i =0;
    for(pPointer =pHead;pPointer != NULL;pPointer = pPointer->pNext)
    //第一次用for这样处理链表结构 节点下一个如果NULL则跳出循环 如果非NULL,则把这个下一个节点赋予给操作指针进行操作 
    {
              pPointer->member = i;
              i += 1;
    }
    i =0;
     //输出 
    for(pPointer = pHead;pPointer != NULL;pPointer = pPointer->pNext)
    {
                 printf("Node %c = %d\n",'A' +i,pPointer->member);
                 i += 1;
    }
    i = 0;
    printf("链表倒序处理\n");
    Intel(&A);
    //处理后需要重新定义头指针 
    pHead = &L; //设定头指针 链表的尾巴做头 
     //输出 
    for(pPointer = pHead;pPointer != NULL;pPointer = pPointer->pNext)
    {
                 printf("Node %c = %d\n",'L' -i,pPointer->member);
                 i += 1;
    }
    i = 0;
    
    Sleep(1000000);
    return 0;
}

void Intel(struct NODE *pNode)
{
     struct NODE *pPointer;//设定操作性指针 
     struct NODE *pPrev = NULL;//上一个
     struct NODE *pNex;//下一个
     
     for(pPointer = pNode;pPointer != NULL;pPointer = pNex)
     {
           pNex = pPointer->pNext;//把指针的下个节点记录下来 
           
           pPointer->pNext = pPrev;//把上一个节点接到这个节点pNext上 
           
           pPrev = pPointer;//把这个节点记录下来  等操作性指针移动到下一个指针式时 进行反上pNext赋值用 
           
           
     }
}

上面红色部分就是这个第一题的源码
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
 
链表的可以操作性就是那个指向自己的pNext结构体指针
struct Node
{
int member;
struct Node *pNext;
};
链表只能往下走,因为它只有pNext进行操作,最后节点是指向NULL (即:0)
也就是
把ABC三个节点连接起来就成为了链表,他们之间的连接就是那个pNext;
Node A,B,C;
A节点的pNext指向B
B节点的pNext指向C
B节点的pNext指向NULL 这样一个有模有样的链表结构就有了
之前有定义过  #define NULL 0 //NULL表示为空
A->B->C->NULL


问题:那么链表定义好后,怎么用仅有的pNext进行操作,使链表倒序呢?
成为这样:
C->B->A->NULL
我想了很久,只有一个思路,就是一个个从头拿下来,再接上他们
就是这样一个步骤


A->B->C->NULL
                                                                    源码是:pPointer = pPointer->pNext;
当操作性指针到A时    把A节点的pNext 直接接到NULL(pPointer是指向A的,那么下一个不是NULL吗?操作指针的pNext如何移动到B呢?
A->NULL      B->C->NULL                                           不慌!每次循环体开始pNex记录下一个节点B)
当操作性指针到B时    把B节点的pNext 接到A节点上(如何指向上一个节点呢?不慌!每次循环体结束pPrev记录上一个节点A)
B->A->NULL   C->NULL
当操作性指针到C时    把C节点的pNext 接到B节点上 (同上)
C->B->A->NULL
这样就大功告成


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值