将链表逆序(递归方式)

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;
        }
    }
}

  

转载于:https://www.cnblogs.com/wuMing-dj/p/3396975.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值