【正确答案】
【答案解析】为了正确地反转一个链表,需要调整指针的指向,而与指针操作相关代码总是非常容易出错的。先举个例子看一下具体的反转过程,例如,i,m,n是3个相邻的结点,假设经过若干步操作,已经把结点i之前的指针调整完毕,这些结点的next指针都指向前面一个结点。现在遍历到结点m,当然,需要调整结点的next指针,让它指向结点i,但需要注意的是,一旦调整了指针的指向,链表就断开了,因为已经没有指针指向结点n,没有办法再遍历到结点n了,所以为了避免链表断开,需要在调整m的next之前要把n保存下来。接下来试着找到反转后链表的头结点,不难分析出反转后链表的头结点是原始链表的尾结点,即next为空指针的结点。下面给出非递归方法实现链表的反转的实现代码。
public void ReverseIteratively(Node head){
Node pReversedHead=head;
Node pNode=head;
Node pPrev=null;
while(pNode!=null){
Node pNext=pNode.next;
if(pNext==null)
pReversedHead=pNode;
pNode.next=pPrev;
pPrev=pNode;
pNode=pNext;
}
this.head=pReversedHead;