zoukankan      html  css  js  c++  java
  • 单链表的逆序(反转)

    单链表的逆序,本来不是算法这一部分的,怎奈何小伙伴们说,面试考的机率比较大,故此就把它跟算法放到一起了。

    关于单链表逆序的基本知识点,请参加:http://blog.csdn.net/autumn20080101/article/details/7607148

    当您看了上面博文的一部分,就能基本了解的时候,下面的内容应该适合您了。下面的内容是对单链表逆序的关键知识点的一个总结。

    博主客人觉得,单链表最关键的是本节点有一个指向下一个节点的指针(即后继节点指针),双向链表则是本节点有一个前驱节点和一个后继节点。

    单链表时通过while循环,从头节点开始,直到节点的后继节点为空时,则到达了链表的尾部。

    其实,单链表逆序,靠的就是下面的关键代码:

     1     while (head != NULL) {
     2         //在头节点改变之前,先获取下一个节点的指针
     3         next = head->Next;
     4         //头节点的下一个节点要改成它的上一个节点,是一个逆转的过程
     5         head->Next = prev;
     6         //上一个节点前移指向头节点
     7         prev = head;
     8         //头节点前移指向下一个节点
     9         head = next;
    10     }

    开发环境为:qt, c语言代码:

    完整代码:

      1 #include <QCoreApplication>
      2 
      3 //定义常数值
      4 #define LEN 3
      5 const int  MAX_NUM = 5;
      6 
      7 //定义节点
      8 //typedef struct tagNode* linkNode;
      9 typedef struct tagNode{
     10   int key;
     11   char value[LEN];
     12   struct tagNode* Next;
     13 } *Node, *linkList;
     14 
     15 //生成链表
     16 linkList generateLinkList();
     17 //释放链表
     18 void freeLinkList(linkList list);
     19 //反转链表
     20 Node ReverseLinkList(Node head);
     21 //打印链表
     22 void printLinkList(linkList list);
     23 
     24 int main(int argc, char *argv[])
     25 {
     26     QCoreApplication a(argc, argv);
     27     //生成链表
     28     Node head = generateLinkList();
     29     printf("反转之前的链表
    ");
     30     //打印链表
     31     printLinkList(head);
     32     //链表反向
     33     head = ReverseLinkList(head);
     34     printf("反转之后的链表
    ");
     35     //打印反向后的链表
     36     printLinkList(head);
     37     //释放链表内存
     38     freeLinkList(head);
     39     return a.exec();
     40 }
     41 /**
     42   * @函数名:generateLinkList
     43   * @参数:无
     44   * @返回值:链表对象指针(首节点)
     45   * @用途:生成链表对象
     46   * @作者:yangfy
     47   */
     48 linkList generateLinkList()
     49 {
     50     Node head, prev;
     51     //头节点
     52     head = (Node)malloc(sizeof(Node));
     53     head->key = 1;
     54     snprintf(head->value, LEN - 1, "%c", 65);
     55     //prev初始指向头节点
     56     prev = head;
     57     //初始化链表元素
     58     for(int i = 1; i < MAX_NUM; i++){
     59         Node pNode = (Node)malloc(sizeof(Node));
     60         //形成链表数据
     61         pNode->key = i + 1;
     62         pNode->Next = NULL;
     63         snprintf(pNode->value, LEN - 1, "%c", 65 + i);
     64         //前一个节点的下一个节点指向本节点(pNode)
     65         prev->Next = pNode;
     66         //把前一个节点置为本节点,进入下一个循环
     67         prev = pNode;
     68     }
     69     return head;
     70 }
     71 /**
     72   * @函数名:freeLinkList
     73   * @参数:head:头节点指针
     74   * @返回值:无
     75   * @用途:链表指针内存资源的释放。
     76   * @作者:yangfy
     77   */
     78 void freeLinkList(Node head)
     79 {
     80     while (head != NULL) {
     81         Node next = head->Next;
     82         free(head);
     83         head = next;
     84     }
     85 }
     86 
     87 /**
     88   * @函数名:ReverseLinkList
     89   * @参数:head:头节点指针
     90   * @返回值:反转后头节点指针
     91   * @用途:链表的反转
     92   * @作者:yangfy
     93   */
     94 Node ReverseLinkList(Node head)
     95 {
     96     Node prev = NULL;
     97     Node next = NULL;
     98     while (head != NULL) {
     99         //在头节点改变之前,先获取下一个节点的指针
    100         next = head->Next;
    101         //头节点的下一个节点要改成它的上一个节点,是一个逆转的过程
    102         head->Next = prev;
    103         //上一个节点前移指向头节点
    104         prev = head;
    105         //头节点前移指向下一个节点
    106         head = next;
    107     }
    108     return prev;
    109 }
    110 
    111 
    112 void printLinkList(linkList list)
    113 {
    114     Node node = list;
    115     while (node != NULL) {
    116         if(node->Next != NULL)
    117             printf("当前的key为:%d, 值为:%s; 下一个key为:%d, 值为%s
    ",node->key, node->value, node->Next->key, node->Next->value);
    118         else
    119             printf("当前的key为:%d, 值为:%s; 下一个key为:NULL, 值为NULL
    ",node->key, node->value);
    120         node = node->Next;
    121     }
    122 }

    运行示例:

  • 相关阅读:
    送给有缘的人,2007年9月20日可买入股票
    上次9.19推荐的兰太实业停牌的公告,有持有的朋友可查看
    送给有缘的人,2007年9月24日可买入股票
    对古越龙山的惆怅
    将PDA矢量图控件开源
    读取PE文件的导入表
    [非原创] 用于将真彩色图像降级为索引图像的八叉树算法
    读取PE文件的资源表
    [VC6] 图像文件格式数据查看器
    关于 AlphaBlend 和 32bpp 的反锯齿图标
  • 原文地址:https://www.cnblogs.com/scud001/p/4423324.html
Copyright © 2011-2022 走看看