分享

单链表的逆序(反转)

 天才白痴书馆 2015-04-16
单链表的逆序,本来不是算法这一部分的,怎奈何小伙伴们说,面试考的机率比较大,故此就把它跟算法放到一起了。
关于单链表逆序的基本知识点,请参加: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("反转之前的链表\r\n");
 30     //打印链表
 31     printLinkList(head);
 32     //链表反向
 33     head = ReverseLinkList(head);
 34     printf("反转之后的链表\r\n");
 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\r\n",node->key, node->value, node->Next->key, node->Next->value);
118         else
119             printf("当前的key为:%d, 值为:%s; 下一个key为:NULL, 值为NULL\r\n",node->key, node->value);
120         node = node->Next;
121     }
122 }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多