编写一个函数,接受一条链表的首节点作为参数,将链表反转并返回结果链表的首节点
解法一
迭代方式解答:
需要记录原链表中三个连续的结点:reverse/first/second。
在每轮迭代中,从原链表中提取结点first并将它插入到逆链表的开头。
同时需要一直保持first指向原链表中所有剩余结点的首节点,second指向原链表中所有剩余结点的第二个结点,reverse指向结果链表中的首结点。
public Node reverse(Node x)
{
Node first=x;
Node reverse=null;
while(first!=null)
{
Node second=first.next;
first.next=reverse;
reverse=first;
first=second;
}
return reverse;
}
在编写和链表相关的代码时,必须小心处理异常情况(链表为空或者只有一个或者两个节点)和边界情况。
递归解答:
假设链表含有N个结点,我们先递归颠倒最后N-1个结点,然后小心地将原链表中的首结点插入到结果链表的末端。
public Node reverse(Node first)
{
if(first==null) return null;
if(first.next=null) return first;
Node second=first.next;
Node rest=reverse(second);
second.next=first;
first.next=null;
return rest;
}
注:递归太抽象,看不懂
PS:《算法》第四版104页