算法题中,一般使用静态链表,可以大幅提升速度。
结点i
的值为value[i]
,left
、right
指针为left[i]
、right[i]
,d
表示数组已用位的下一位;
默认0
号位为首结点,1
号位为尾结点,不存储任何实际值,-1表示空指针;
int value[n], left[n], right[n], d = 2;
left[0] = right[1] = -1, right[0] = 1, left[1] = 0;
在结点x
的后面插入值为a
的节点:
value[d] = a;
left[d] = x, right[idx] = right[x];
right[x] = d, left[right[x]] = d++;
删除结点x
:
right[left[x]] = right[x];
left[right[x]] = left[x];
注解:
(1)双链表有首、尾结点的好处是,在表首、尾部进行操作时,与在表中部进行操作的代码一致。
(2)无首、尾结点的双链表如下:
节点i
的值为value[i]
,left
、right
指针为left[i]
、right[i]
,d
表示数组已用位的下一位,head
、tail
表示首、尾指针,-1
表示空指针;
int value[n], left[n], right[n], d = 0, head = -1, tail = -1;
无首、尾结点的双链表在表首、尾部进行操作时,与在表中部进行操作的代码不一致;
在表首插入值为a
的结点:
value[d] = a;
left[d] = -1, right[d] = head;
head = d++;
删除表首的一个结点:
head = right[head];
left[head] = -1;
(在tail
侧进行插入和删除和head
端类似,只需把head
和tail
、left
和right
互换即可)