初始状态,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)所示:
从图(1)的初始状态到图(2)状态共做了四个操作,这四个操作的伪代码如下:
next = head->next;
head->next = prev;
prev = head;
head = next;
现在来总结一下,循环的初始条件是:
prev = NULL;
循环迭代体是:
next = head->next;
head->next = prev;
prev = head;
head = next;
循环终止条件是:
head == NULL
//循环倒序
LINK_NODE *ReverseLink(LINK_NODE *head)
{
LINK_NODE *next;
LINK_NODE *prev = NULL;
while(head != NULL)
{
next = head->next;
head->next = prev;
prev = head;
head = next;
}
return prev;
}
递归思想//递归倒序
LINK_NODE *ReverseLink2(LINK_NODE *head)
{
LINK_NODE *newHead;
if((head == NULL) || (head->next == NULL))
return head;
newHead = ReverseLink2(head->next); /*递归部分*/
head->next->next = head; /*回朔部分*/
head->next = NULL;
return newHead;
}
利用ReverseLink2()对问题进行求解,将链表分为当前表头节点和其余节点,递归的思想就是,先将当前的表头节点从链表中拆出来,然后对剩余的节点进行逆序,最后将当前的表头节点连接到新链表的尾部。