剑指Offer的学习笔记(C#篇)-- 反转链表

题目描述

输入一个链表,反转链表后,输出新链表的表头。

一 . 概念普及

        关于线性表等相关概念请点击这里

二 . 实现方法

        目前,可以有两种方法实现该要求。

        方法一:借助外部空间实现。这里可以将单链表储存为数组,然后按照数组的索引逆序进行反转。此处,可理解为将链表装换为顺序表,然后把队伍方向反转,但是,此方式比较浪费空间,而且需要两次遍历,效率不占优势。

        代码实现:

public static Node ReverseList1(Node head)
    {
         //指针是否为空判断(鲁棒性)
        if(head == null)
        {
            return null;
        }
         //定义新的链表nodeList
        List<Node> nodeList = new List<Node>();
        //当head不为空时,执行
        while (head != null)
        {
            nodeList.Add(head);
            head = head.Next;
        }
        //
        int startIndex = nodeList.Count - 1;
        for (int i = startIndex; i >= 0; i--)
        {
            Node node = nodeList[i];
            if (i == 0)
            {
                node.Next = null;
            }
            else
            {
                node.Next = nodeList[i - 1];
            }
        }
        // 现在头结点是原来的尾节点
        head = nodeList[startIndex];
        return head;
    }

        方法二:三指针法,不做过多阐述,代码备注蛮详细的。下图即为具体实现过程。

        代码实现:

class Solution
{
    public ListNode ReverseList(ListNode pHead)
    {
        // write code here
        //鲁棒判定
        if(pHead == null)
        {
            return null;
        }
        //定义A B 两个指针
        ListNode A = null;
        ListNode B = null;
        //循环操作
        while(pHead != null)
        {
            //定义B为PHead后面的数,定义A为pHead前面的数
            B = pHead.next;
            pHead.next = A;  //这一部分就理解成A是PHead前面的那个数吧。
            //然后再把A和pHead都提前一位
            A = pHead;
            pHead = B;
        }
        //循环结束后,返回新的表头,即原来表头的最后一个数。
        return A;
    }
}

        当然,用递归也能实现哦。该题鲁棒判断在于指针是否为空。

posted @ 2019-05-19 14:39  WeiMLing  阅读(500)  评论(0编辑  收藏  举报