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;
其在堆上分布如下:
data | next | |
497 | 1 | 499 |
498 | -1 | |
499 | 2 | 501 |
500 | ||
501 | 4 |
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