题目描述:
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表节点定义如下:
public class ListNode
{
int val;
ListNode next;
ListNode(int x)
{
val=x;
}
}
示意图:
分析:
为了正确反转一个链表,需要调整链表中指针的方向,为了将调整指针这个复杂的过程分析清楚,我们可以借助图形来分析,如上图所示,在(a)所示的链表中,h、i和j是3个相邻的结点。假设经过若干操作,我们已经把结点h之前的指针调整完毕,这些结点的next都指向前面一个结点,接下来我们把i的next指向h,此时的链表的结构图如图(b)所示。
不难注意到,由于结点i的next指向了它的前一个结点,导致我们无法在链表中遍历到结点j。为了避免连边在结点i处断开,我们需要在调整结点i的next之前,把节点j保存起来。
也就是说我们在调整结点i的next指针时,除了需要知道节点i本事之外,还需要i的前一个结点h,因为我们需要把结点i的next指向节点h,同时,我们还事先需要保存i的一个节点j,以防止链表断开。因此我们需要定义3个指针,分别指向当前遍历到的结点、它的前一个结点以及后一个结点。
注意:
(1)输入的链表头指针为null或者整个链表只有一个结点时
(2)翻转后的链表出现断裂
代码:
package offer;
public class reverseList
{
public ListNode reverse(ListNode head)
{
ListNode pReverseHead=null;
ListNode pNode=head;
ListNode pPrev=null;
while (pNode.next!=null)
{
ListNode pNext=pNode.next;
if (pNext==null)
{
pReverseHead=head;
}
pNode.next=pPrev;
pPrev=pNode;
pNode=pNext;
}
return pReverseHead;
}
}