单向链表翻转

struct linka {
int data;
linka* next;
};
void reverse(linka*& head) {
if(head ==NULL)
return;
linka *pre, *cur, *ne;
pre=head;
cur=head->next;
while(cur)
{
ne = cur->next;
cur->next = pre;
pre = cur;
cur = ne;
}
head->next = NULL;
head = pre;
}
其中比较难理解的是linka*& head,传入的其实就是linka *的类型就可以了,linka *是表示linka类型的指针,&表示head的引用,而不是地址
首先定义3个指针,分别是前中后,然后当中间那个指针非空,就是当前不是空,就做循环里的事情
注意的是这个算法里面next是在循环里面赋值的
每次循环都把current指向previous了,然后大家都往后移一个,next=current->next必须在current改变方向之前做,否则改变了方向之后current的next就变成previous了.
最后跳出循环之后,将header的next首先置空,因为head变成了最后一个node了.然后head就变成了previous,因为当时 current和next都为NULL了,只有previous为最后一个节点(或者说这时候应该是第一个非空节点,也就是head)
终于把整个算法理解了一遍,最后想想其实挺简单,但是能用c++写出来也不太容易,特别是在面试的时候.
再增加一个递归的单链表反转的方法:

1 static link ReverseLink3(link pNode)   // using recursion

2         {

3             if (pNode.next == null)

4                 return pNode;

5             link pNext = pNode.next;

6             link head = ReverseLink3(pNext);

7             pNext.next = pNode;

8             pNode.next = null;

9             return head;

10         }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值