Пример #1
0
        public LinkedNode Reverse3(LinkedNode head)
        {
            //好好想想,有点绕
            if (head == null || head.Next == null)
            {
                return(head);                                            //左边防止第一次就是null,右边用于递归
            }
            //递归对head节点之后的链表进行逆转,逆转后的头节点是newhead
            LinkedNode newhead = Reverse3(head.Next);

            head.Next.Next = head;            //反转的尾和原链表的最后一个 正好差2个位置,画图
            //因为head.Next==newhead 即 newhead.Next=head;这样写保证了递归返回的节点为反转后的头结点
            head.Next = null;
            return(newhead);
        }
Пример #2
0
        public LinkedNode Reverse2(LinkedNode head)
        {
            if (head == null)
            {
                return(null);
            }
            LinkedNode pre = null, current = head, temp;

            while (current != null)
            {
                temp         = current.Next;  //临时节点指向 原链表后一个节点
                current.Next = pre;           //当前节点指向 反转表的头
                pre          = current;       //pre  指向   反转表的头
                current      = temp;          //当前节点   指向  临时节点
            }
            return(pre);
        }
Пример #3
0
        //1 使用栈
        //2 使用双指针
        //3 使用递归

        public LinkedNode Reverse1(LinkedNode head)
        {
            Stack <LinkedNode> nodes = new Stack <LinkedNode>();

            while (head != null)
            {
                nodes.Push(head);
                head = head.Next;
            }
            LinkedNode newHead = new LinkedNode()
            {
                Value = 0
            };
            LinkedNode n = newHead;

            while (nodes.Peek() != null)
            {
                newHead.Next = nodes.Pop();
                newHead      = newHead.Next;
            }
            return(n.Next);
        }