头插法反转链表(非递归实现)
- 在原有链表的基础上,依次将链表头部节点摘下,然后利用头插至新的表头(建议:画图更容易理解过程)
- 实现代码如下:
#include <iostream>
#include <malloc.h>
using namespace std;
typedef int data_t;
typedef struct node{
data_t data;
struct node *next;
}LinkNode_t;
LinkNode_t* LinkList_Create(){
auto head = static_cast<LinkNode_t *>(malloc(sizeof(LinkNode_t)));
head->next = nullptr;
return head;
}
int LinkList_Insert_Head(LinkNode_t *head,int value){
auto newNode = static_cast<LinkNode_t*>(malloc(sizeof(LinkNode_t)));
newNode->data = value;
newNode->next = head->next;
head->next = newNode;
return 0;
}
int LinkList_Insert_Tail(LinkNode_t *head,int value){
auto newNode = static_cast<LinkNode_t*>(malloc(sizeof(LinkNode_t)));
newNode->data = value;
newNode->next = NULL;
while(head->next != NULL)
head = head->next;
head->next = newNode;
return 0;
}
int Linklist_Reverse(LinkNode_t *head){
LinkNode_t *temp = nullptr;
LinkNode_t *cur = head->next;
head->next = nullptr;
while(cur != nullptr){
temp = cur;
cur = cur->next;
temp->next = head->next;
head->next = temp;
}
return 0;
}
int LinkList_Show(LinkNode_t *head){
while(head->next != nullptr){
head = head->next;
cout << head->data << " ";
}
cout<<endl;
return 0;
}
int main(int argc, const char *argv[])
{
LinkNode_t *head = LinkList_Create();
LinkList_Insert_Head(head,11);
LinkList_Insert_Head(head,22);
LinkList_Insert_Head(head,33);
cout << "原链表为:";
LinkList_Show(head);
Linklist_Reverse(head);
cout << "链表逆置:";
LinkList_Show(head);
return 0;
}