将链表逆序(递归方式)

namespace ShopEx.CRS.Test
{
    /// <summary>
    ///将链表逆序
    /// </summary>
    public class ReverseLinkList
    {
        //入口
        public static void Do()
        {
            //创建单链表
            int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            Node head = new Node() { Num = array[0] };
            Node tmp = head;
            for (int i = 1; i < array.Length; i++)
            {
                Node newNode = new Node() { Num = array[i] };
                tmp.Next = newNode;
                tmp = tmp.Next;
            }

            //显示原链表
            Console.WriteLine("原链表:" + DisplayLinkList(head));

            //逆序
            Node newHead = null;
            Reverse_Recursive(head, head, ref newHead);
            //显示逆序后的链表
            Console.WriteLine("原链表:" + DisplayLinkList(newHead));
        }

        /// <summary>
        /// 采用递归的方式
        /// </summary>
        /// <param name="cur">原链表头结点</param>
        /// <param name="pre">当前节点的前驱节点</param>
        /// <param name="tail">原链表的尾节点</param>
        public static void Reverse_Recursive(Node cur, Node pre, ref Node tail)
        {
            if (cur == null) return;

            //记录链表的尾节点
            if (cur.Next == null)
            {
                tail = cur;
                return;
            }

            //移动到下一个节点
            pre = cur;
            cur = cur.Next;

            //对下一个节点继续递归调用
            Reverse_Recursive(cur, pre, ref tail);

            cur.Next = pre;
            pre.Next = null;//这边防止原链表头结点与后驱节点形成环形链
        }

        public static string DisplayLinkList(Node head)
        {
            string linkListStr = string.Empty;
            while (head!=null)
            {
                linkListStr += head.Num + ",";
                head = head.Next;
            }
            return linkListStr;
        }

        public class Node
        {
            public int Num;
            public Node Next;
        }
    }
}

  

posted on 2013-10-30 15:57  豆沙包没有肉  阅读(296)  评论(0编辑  收藏  举报

导航