ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-05-19 14:53:37  阅读:266  来源: 互联网

标签:head nodeList Offer C# 链表 pHead return null


题目描述

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

一 . 概念普及

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

二 . 实现方法

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

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

        代码实现:

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

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

标签:head,nodeList,Offer,C#,链表,pHead,return,null
来源: https://www.cnblogs.com/WeiMLing/p/10889213.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有