【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
推荐阅读
- LeetCode刷题记录|LeetCode 987. 二叉树的垂序遍历
- LeetCode|LeetCode刷题笔记(279.完全平方数)
- 算法|回溯算法——洛谷p1036
- 数据结构设计简单 LeetCode1656. 设计有序流
- leetcode|leetcode 数据库练习
- leetcode|LeetCode 5955. 摘水果 题目解析
- 算法刷题|LeetCode刷题笔记-21.合并两个有序链表
- LeetCode|LeetCode1143. 最长公共子序列
- #|力扣-105题 从前序与中序遍历序列构造二叉树(C++)- dfs