解题思路
1:头节点插入法
创建一个新的链表,然后循环旧链表并使用头插法插入数据到新的链表,完成后便是一个反转的链表
2:原地反转
头结点插入法的实质是重新创建了一个新的链表,通过遍历待反转链表,将链表每一个节点插入到创建的链表中,然后的到的这个创建的链表就是反转后的链表。而就地反转实质就是在待反转链表基础上修改节点顺序得到反转链表。
边界条件
1:链表为空
2:链表只有一个元素
代码实现
建立在这篇博客的基础上php实现链表
$tmpLinkList = new LinkList();
//头插法反转
public function reversal($tmpLinkList) {
$tmpPrev = $tmpLinkList->head;
$prev = $this->head->next;
if($prev == null){
echo "链表为空"."\n";
return;
}
if($prev->next == null){
echo "链表只有一个元素"."\n";
return;
}
while($prev != null) {
$val = $prev->val;
$prev = $prev->next;
$tmpPrev->next = new Node($val, $tmpPrev->next);
}
$this->head = $tmpPrev;
}
//原地反转
public function reversalInPlace() {
$prev = $this->head->next;
if($prev == null){
echo "链表为空"."\n";
return;
}
if($prev->next == null){
echo "链表只有一个元素"."\n";
return;
}
$pNext = $prev->next;
$tmp = null;
while($pNext != null) {
$tmp = $pNext->next;
$pNext->next = $prev;
$prev = $pNext;
$pNext = $tmp;
}
//此时pNext指向原始链表最后一个元素,也是逆转后的链表的表头元素
$this->head->next->next = null; //设置链表尾
$this->head->next = $prev; //调整链表头
}