Leetcode|LeetCode 反转链表-C++

【Leetcode|LeetCode 反转链表-C++】反转一个单链表。
示例:

输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL

两种思路:
第一种:以头节点的方式新建一个链表; 第二种:改变自身指针的指向 preNode curNode nextNode

代码实例:
#include #include #include typedef struct NodeList { int val; NodeList* next; }NodeList; void initList(NodeList* head) { NodeList* newNode; NodeList* tailNode = head; for (int i = 1; i <= 5; i++) { newNode = (NodeList*)malloc(sizeof(NodeList)); newNode->val = i; newNode->next = NULL; tailNode->next = newNode; tailNode = newNode; } }void myPrintList(NodeList* list) { while(NULL != list) { printf("%d ", list->val); list = list->next; } printf("\n"); }/// 第一种:以头节点的方式新建一个链表 void convertList1(NodeList* srcList, NodeList* dstList) { NodeList* newNode; while(NULL != srcList) { newNode = (NodeList*)malloc(sizeof(NodeList)); newNode->val = srcList->val; newNode->next = NULL; newNode->next = dstList->next; dstList->next = newNode; srcList = srcList->next; } } // 第二种:改变自身指针的指向 preNode curNode nextNode void convertList2(NodeList* head) { NodeList* curNode = head, *preNode, *nextNode; while(NULL != curNode) { nextNode = curNode->next; // 先保存后面的节点 curNode->next = preNode; preNode = curNode; curNode = nextNode; } myPrintList(preNode); }int main(int argc, char** argv) { NodeList* head = (NodeList*)malloc(sizeof(NodeList)); initList(head); myPrintList(head->next); NodeList* convertHead = (NodeList*)malloc(sizeof(NodeList)); convertList1(head->next, convertHead); myPrintList(convertHead->next); convertList2(head->next); return 0; }

运行结果:
1 2 3 4 5 5 4 3 2 1 5 4 3 2 1

    推荐阅读