反转链表
1 双指针解法 :
关键点:两个用来翻转链表中指针的指向,后面一个用来存值,移动到最后返回头节点。
//定义三个指针
ListNode *middle=head;
ListNode *front=NULL;
ListNode *latter;
//移动上述三个的位置
//终止条件
while(middle) //停止条件middle为空,说明已经移动到最后一位结束了
{
//翻转操作
latter=middle->next;//在middle指向front之前,把下一位先存值
middle->next=front;
//翻转完成
//向后移动
front=middle;
middle=latter;//这里要先让最前面的front往前走一个,因为如果先走middle,front就找不到middle了
}
return front;
2 递归解法
相当于把双指针解法中把三个指针手动向前移动一位的操作改成函数递归操作了
ListNode *reverse(ListNode *front,ListNode *middle)
{
if(middle=NULL) return front;//先写判断条件
//翻转操作
ListNode *latter=middle->next;
middle->next=front;
return reverse(middle,latter);
}
ListNode *reverseList(ListNode *head)
{
return reverse(NULL,head);
}