算法--单链表逆序
程序员文章站
2022-04-25 17:41:39
...
单链表逆序
思路
code
//单链表逆序
//注意:head->next才是头结点,而不是head!head只是指向头结点的指针
//因为头指针与头结点不同,头结点即第一个结点,头指针是指向第一个结点的指针。
//链表中可以没有头结点,但不能没有头指针
#if 1
#include <stdio.h>
typedef struct node {
int data;
struct node *next;
} linkList;
//初始化带头节点的单链表
linkList *creatLinkList(void) {
linkList *head =
(linkList *)malloc(sizeof(linkList)); //创建新节点并申请堆内存
head->data = 0; //初始化头节点值为0
head->next = NULL; //头结点的指针域指向空
return head;
}
void insertNode(linkList *current, int n) {
int i;
linkList *newNode = NULL;
for (i = 1; i <= n; i++) {
newNode = (linkList *)malloc(sizeof(linkList));
if (current == NULL || newNode == NULL) {
return;
}
newNode->data = i;
newNode->next = NULL;
current->next = newNode;
current = newNode;
}
}
void inverseLink(linkList *head) {
#if 1
linkList *p, *q;
p = head->next; //记录第一个节点地址
head->next = NULL; //把链表设置成空表
//一次按头插法将各个节点插入,实现逆置
while (p != NULL) {
q = p; //用q备份待插入节点地址
p = p->next; //将p变更为待插入节点的后继节点
q->next = head->next; //将q(待插入节点)插入到头节点的前面
head->next = q; //将新插入节点作为新的头节点
}
#else
linkList *temp = NULL;
linkList *p, *q;
if (head == NULL) {
return;
}
p = head->next;
q = head->next->next;
if (p == NULL || q == NULL) {
return;
}
while (q != NULL) {
temp = q->next;
q->next = p;
p = q;
q = temp;
}
head->next->next = NULL;
head->next = p;
#endif
}
void printLinkList(linkList *head) {
linkList *p = head->next;
while (p != NULL) {
printf("%d -> ", p->data);
p = p->next;
}
printf("\r\n");
}
int main() {
int i;
linkList *head = NULL;
head = creatLinkList();
insertNode(head, 10);
printf("原始链表:\r\n");
printLinkList(head);
inverseLink(head);
printf("逆序后链表:\r\n");
printLinkList(head);
scanf("%d", &i);
return 0;
}