一,不带头节点的单链表逆序
int reverse(LinkList *head) //不带头结点
{
if(*head == NULL)
return -1;
LinkList prevNode = *head; //0、记录前一个节点与当前节点
LinkList node = prevNode->next;
while(node != NULL) //只要当前节点存在
{
LinkList nextNode = node->next; //1、先记录当前节点的后一个节点
node->next = prevNode; //2、让当前节点(node)的下一个节点(node->next)指向(=)前一个节点(prev)
prevNode = node; //3、让前一个节点指向当前节点、当前节点指向原先记录的下一个节点
node = nextNode;
}
(*head)->next = NULL; //4、让原来的第一个元素变为尾元素,尾元素的指针域置NULL
*head = prevNode; //5、让链表的头指针指向原来的尾元素
return 0;
}
/*头插法-----------不带头节点*/
int main()
{
int i;
Node *head = NULL;
Node *tail = NULL;
Node *new_Node = NULL;
for(i=0;i<10;i++)
{
new_Node = malloc(sizeof(Node));
new_Node->data = i+1;
new_Node->next = NULL; //将即将要插入的节点打包(数据域放什么,指针域放什么)
new_Node->next = head;
head = new_Node;
}
printf("原链表\n");
Output_L(head);
reverse(&head);
printf("反转后的链表\n");
Output_L(head);
}
执行结果
二,带头节点的单链表逆序
int reverse_H(LinkList *head) //带头结点
{
if(*head == NULL)
return -1;
LinkList prevNode = (*head)->next;
LinkList node = prevNode->next;
while(node != NULL)
{
LinkList nextNode = node->next;
node->next = prevNode;
prevNode = node;
node = nextNode;
}
(*head)->next->next = NULL; //将头节点后一个元素的指针域置NULL
(*head)->next = prevNode; //让链表的头节点指向原来的尾元素
return 0;
}
/*头插法-----------带头节点*/
int main()
{
int i;
Node *head = NULL;
Node *new_Node = NULL;
head = malloc(sizeof(Node));
head->data = -1;
head->next = NULL;
for(i=0;i<10;i++)
{
new_Node = malloc(sizeof(Node));
new_Node->data = i+1;
new_Node->next = NULL;
new_Node->next = head->next;
head->next = new_Node;
}
printf("原链表\n");
Output_HL(head);
reverse_H(&head);
printf("反转后的链表\n");
Output_HL(head);
}
执行结果
链表节点的结构体定义与链表输出函数见我的上一篇博客https://blog.youkuaiyun.com/TAlice/article/details/82112921
关于单链表更多的操作请参考我的github库的代码https://github.com/TAlicer/supertao/blob/master/linklist/linkmid.c