核心逆置的算法主要用到3个指针关系如上图分别为:pre,p,q.
-
定义三个指针pre、p、q,其中pre指向当前节点的前一个节点,p指向当前节点,q指向当前节点的下一个节点。
-
初始时我们将pre指向NULL,p指向链表的头结点。因为翻转后的链表头节点为原来链表的尾节点,所以p指向头节点。
要将其逆置我们改变箭头指向即可:
让p->next=pre就这样指针依次后移,重复操作即可,p在结点5,让p->next=pre,head->next=p,便实现了。
核心理解代码:
完整代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}LinkNode;
LinkNode* Create(LinkNode *L,int n)
{
int i;
LinkNode *p;
L= (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
LinkNode *tail = L;
for(i = 0; i < n; i++)
{
p=(LinkNode*)malloc(sizeof(LinkNode));
p->data = i;
p->next = NULL;
tail->next = p;
tail = p;
}
return L;
}
LinkNode* back(LinkNode *L) //链表翻转
{
if(L==NULL||L->next==NULL)
{
return L;
}
LinkNode* pre = NULL;
LinkNode* p = L->next;
LinkNode* q = L->next->next;
while(q!=NULL)
{
p->next = pre;
pre = p;
p = q;
q = q->next;
}
p->next = pre;
L->next = p;
return L;
}
int main()
{
LinkNode *p;
LinkNode *L=NULL;
L=Create(L,6);
printf("初始链表: ");
p= L->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
L=back(L);
printf("逆置后的链表: ");
p = L->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return 0;
}
运行结果: