题目描述
输入一个链表,反转链表后,输出新链表的表头。
思路
这题蛮新颖的,想了蛮久,都没想出比较好的做法。看了下别人的答案,才知道该怎么做。
这一题的用意就是让我们把类似
1->2->3->4->5->6
变成 6->5->4->3->2->1
我们用head
表示当前节点,next
用来表示子节点。
我们变换的步骤
由head->next
到next->head
也就是说,我们的 当前和子节点之间要互换位置
那么如何实现互换位置呢?
next->next = head;
head->next = null;
这样是实现了,对换。
这里有出现了一个问题,我们的链表有多个节点,不止这一个
例如1->2->3->4
我们要换到 4->3->2->1
2->1 3->4
当我们进行下一步操作,即 head =3 next = 4
时进行不了,因为我们没有保存前面链表的状态
用我们上面的方法是没法实现的,我们映入一个 pre
节点,用来保存前面链表的状态
那么我们之前的操作就变成
next=head->next; //保存后面的链表,防止断链
head->next = pre; //使我们当前的节点后面插入前面的节点,实现倒序
pre = head; // 赋值 pre为当前节点,后面会被插入
head = next; //向后移位
实现代码
<?php
/*class ListNode{
var $val;
var $next = NULL;
function __construct($x){
$this->val = $x;
}
}*/
function ReverseList($pHead)
{
$pre = null;
$next = null;
while($pHead!=null){
$next = $pHead->next;
$pHead->next = $pre;
$pre = $pHead;
$pHead = $next;
}
return $pre;
}