C#数据结构之链表的总结

此处定义单链表的数据结构与LeetCode上相同,为:

            public class ListNode
                {
                    public int val;
                    public ListNode next;
                    public ListNode(int x)
                    {
                        val =x;
                    }

                }

首先来看几个:
例子1

            ListNode head = new ListNode(1);
            head.next = new ListNode(2);
            head.next.next = new ListNode(3);
            ListNode headA = head;
            ListNode headB = head;
            headA.val= 5
            Console.WriteLine(head.val);

输出是 5

例子2

            ListNode head = new ListNode(1);
            head.next = new ListNode(2);
            head.next.next = new ListNode(3);
            ListNode headA = head;
            ListNode headB = head;
            headA.next = new ListNode(5);
            Console.WriteLine(head.val);

输出是 1

例子3

            ListNode head = new ListNode(1);
            head.next = new ListNode(2);
            head.next.next = new ListNode(3);
            ListNode headA = head;
            ListNode headB = head;

            unsafe
            {
                fixed(int* hp = &head.val)
                {
                    Console.WriteLine((int)hp);
                }
                fixed(int* hpA = &headA.val)
                {
                    Console.WriteLine((int)hpA);
                }
                fixed(int* hpB = &headB.val)
                {
                    Console.WriteLine((int)hpB);
                }

            }

输出的地址相同,分别是:

34677688
34677688
34677688

例子4

            ListNode head = new ListNode(1);
            head.next = new ListNode(2);
            head.next.next = new ListNode(3);
            ListNode headA = head;
            ListNode headB = head;

            //head的地址
            GCHandle h = GCHandle.Alloc(head, GCHandleType.WeakTrackResurrection);
            IntPtr addr = GCHandle.ToIntPtr(h);
            Console.WriteLine("0x" + addr.ToString("X"));
            //headA的地址
            GCHandle hA = GCHandle.Alloc(headA, GCHandleType.WeakTrackResurrection);
            IntPtr addrA = GCHandle.ToIntPtr(hA);
            Console.WriteLine("0x" + addrA.ToString("X"));
            //headB的地址
            GCHandle hB = GCHandle.Alloc(headB, GCHandleType.WeakTrackResurrection);
            IntPtr addrB = GCHandle.ToIntPtr(hB);
            Console.WriteLine("0x" + addrB.ToString("X"));
            Console.ReadLine();

输出的地址不同,分别是:

0x4110F8
0x4110F4
0x4110F0

由以上4个例子,我们可以得出链表的数据结构:

headA = head表示headA中的值类型val指向了head的值类型val,地址相同,headA中的引用next复制了headnext,地址不同,总体来看, headAhead在堆上是不同的地址。

例子5

            ListNode head = new ListNode(1);
            head.next = new ListNode(2);
            head.next.next = new ListNode(3);
            ListNode headA = head;
            ListNode headB = head;
            headA.next.next = null;
            Console.WriteLine(head.next.next.val);

输出报错,提示head.next.next 为空指针。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值