单链表的逆序,本来不是算法这一部分的,怎奈何小伙伴们说,面试考的机率比较大,故此就把它跟算法放到一起了。
关于单链表逆序的基本知识点,请参加: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 }
运行示例: