链表在内存与堆上的内存分布

class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

如上所示一个基本的链表节点定义,包括data域和next域,每一个node节点在堆上分配空间,且在物理空间不连续,如下所示

ListNode node = new ListNode(1);
node.next = new ListNode(2);
node.next.next = new ListNode(4);
ListNode head = new ListNode(-1);
ListNode prev = head;
prev.next = node;

其在堆上分布如下:

 datanext
4971499
498-1 
4992501
500  
5014 

 

node链表在堆上占用三个node空间,物理不连续,逻辑连续(通过next指向寻找真正地址)

head新建-1的node节点;prev也指向这个-1的node节点;

prev.next赋值node链表,即堆上498的node空间的next赋值了497;

此时head链表逻辑顺序为:498 -> 497 -> 499 -> 501;这个顺序完全依赖于每个node节点的next指向

如下接下来操作node翻转,497 -> 499 -> 501变幻为 501 -> 499 -> 497,这个是体现在堆上的,那么此时head的链表即为:498 -> 497 -> NULL

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值