反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
两种思路:
第一种:以头节点的方式新建一个链表;
第二种:改变自身指针的指向 preNode curNode nextNode
代码实例:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
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