链表的逆序是常见考题,今天来简单学习使用如何实现单向链表的逆序。
逆序过程
初始链表状态
初始状态,prev是NULL,head指向当前的头节点A,next指向A节点的下一个节点B。首先从A节点开始逆序,将A节点的next指针指向prev,因为prev的当前值是NULL,所以A节点就从链表中脱离出来了,然后移动head和next指针,使它们分别指向B节点和B的下一个节点C(因为当前的next已经指向B节点了,因此修改A节点的next指针不会导致链表丢失)。逆向节点A之后,链表的状态如图(2)所示:
用这种方法依次向后逆序就可以了
逆序代码示例
结合上面图示理解
struct node *reverse(struct node *head)
{
struct node *prev;//指向逆序完的链表的第一个节点
struct node *next;//指向将要实现逆序的节点
prev = NULL;
while(head != NULL)
{
next = head->next;//把未逆序的head指向的节点的下一个节点让next保存,建立当前未逆序节点和下一个未逆序节点的链接
head->next = prev;//让head指向的节点的下一个节点保存prev指向的节点,建立上一个逆序节点和当前未逆序节点的链接
prev = head;//把head指向的节点让prev保存,逆序节点头指针前移
head = next;//把next指向的节点让head保存,未逆序指针头结点后移
}
return prev;//逆序完成的头结点是prev,返回
};
完整代码检验
/*********************************************************************************
* Copyright: (C) 2017 fanmaolin<fanmaolinn@gmail.com>