有两种方法,一种是非递归,另外一种是递归
非递归算法中,用到三个连续的结点,分别表示p,q,r,其中p.next = q,q.next = r,当然本身链表为空,直接返回null,如果只有一个结点,返回头结点,如果有两个结点,将q.next=p,p.next = null,否则q.next = p,p = q,q = r
代码如下:
class ListNode
{
int val;
ListNode next;
ListNode(int x) { val = x; next = null;}
}
class Solution
{
public ListNode reverseList(ListNode head)
{
if (null == head) return head;
ListNode p = head;
ListNode q = null, r = null;
if (p.next != null)
{
q = p.next;
r = q.next;
q.next = p;
p.next = null;
p = q;
q = r;
}
while (q != null)
{
r = q.next;
q.next = p;
p = q;
q = r;
}
return p;
}
}
另一种解法,与上相同,只是代码更精简些
代码如下:
class ListNode
{
int val;
ListNode next;
ListNode(int x) { val = x;}
}
class Solution
{
public ListNode reverseListNode(ListNode head)
{
ListNode cur = head, pre = null, tmp = null;
while (cur != null)
{
tmp = cur.next;
cur.next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
}
public class Main
{
public static void main(String[] args)
{
// write your code here
Solution solver = new Solution();
int[] nums = {1};
ListNode phead = null, ptail = null;
for (int i = 0; i < nums.length; i++)
{
if (null == phead)
{
phead = new ListNode(nums[i]);
ptail = phead;
}
else
{
ptail.next = new ListNode(nums[i]);
ptail = ptail.next;
}
}
ListNode ans = solver.reverseListNode(phead);
while(ans != null)
{
System.out.print(ans.val + "->");
ans = ans.next;
}
System.out.println();
}
}
在递归算法中,递归退出条件为(1)头结点为空,返回空,(2)是最后一个结点,返回最后一个结点
f(p)递归时,使用f(p.next)返回的是最后一个结点,过后需要将结点返转,p.next.next=p,如果p是头结点,将p.next=null
代码如下:
class ListNode
{
int val;
ListNode next;
ListNode(int x) { val = x; next = null;}
}
class Solution
{
public ListNode reverseList(ListNode head)
{
ListNode p = head;
if (null == p) return null;
if (null == p.next)
{
return p;
}
ListNode q = reverseList(p.next);
p.next.next = p;
if (p == head)
{
p.next = null;
}
return q;
}
}