单链表的反转

来源:互联网 发布:php json数组 编辑:程序博客网 时间:2024/06/15 13:51

有两种方法,一种是非递归,另外一种是递归

非递归算法中,用到三个连续的结点,分别表示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;    }}



0 0
原创粉丝点击