单链表的逆序(循环与递归)


初始状态,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()对问题进行求解,将链表分为当前表头节点和其余节点,递归的思想就是,先将当前的表头节点从链表中拆出来,然后对剩余的节点进行逆序,最后将当前的表头节点连接到新链表的尾部。


递归终止条件就是链表只剩一个节点时直接返回这个节点的指针。可以看出这个算法的核心其实是在回朔部分,递归的目的是遍历到链表的尾节点,然后通过逐级回朔将节点的next指针翻转过来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值