反转链表
链表翻转最主要的内容就是改变指针指向,
注意:
如果他本身就是张空表,我们直接返回即可。
链表初始:1,2,3,4,5,6,7,8,9,10
反转链表:10,9,8,7,6,5,4,3,2,1
交换思想:第一个结点和第二个结点交换,头结点不变,第二次头结点和第三个交换,依次类推......
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node* next;
}NODE;
//头插法将数据插进链表
int slist_add(NODE** head, int data)
{
NODE* pNew = (NODE*)malloc(sizeof(NODE));
if (!pNew)
{
puts("内存创建失败");
return -1;
}
pNew->data = data;
pNew->next = *head;
*head = pNew;
return 0;
}
//遍历链表
void slist_print(const NODE* head)
{
const NODE* p = head;
while (p)
{
printf("%d\t", p->data);
p = p->next;
}
}
//交换链表
void slist_swop(NODE** head)
{
NODE* q = *head, * p = (*head) -> next;
if(!q)
return 0;//空链表直接退出
while (p)
{//第一个结点和第二个结点交换,头结点不变,第二次头结点和第三个交换,依次类推......
q->next = p->next;
p->next = *head;
*head = p;
p = q->next;
}
}
//释放内存
void slist_free(NODE** head)
{
NODE* p = *head, * q = NULL;
while (p)
{
q = p;
p = p->next;
free(q);
}
*head = NULL;
}
int main()
{
NODE* head = NULL;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10};
for (int i = 0; i < 10; i++)
slist_add(&head, arr[i]);
slist_print(head);
printf("\n=========================\n");
slist_swop(&head);
slist_print(head);
slist_free(&head);
return 0;
}
结果展示: