/* Returns an offset to use for iterating with ziplistNext. When the given
* index is negative, the list is traversed back to front. When the list
* doesn't contain an element at the provided index, NULL is returned. */unsignedchar*ziplistIndex(unsignedchar*zl,int index){
unsignedchar*p;unsignedint prevlensize, prevlen =0;// 当 index < 0 的时候,反向遍历找到对应位置// 比如 index = -2, 就是倒数第二个节点// 注意:倒数第一个节点是 ZIP_ENDif(index <0){
index =(-index)-1;// 得到压缩列表的尾节点
p =ZIPLIST_ENTRY_TAIL(zl);if(p[0]!= ZIP_END){
// 得到前一个节点的长度ZIP_DECODE_PREVLEN(p, prevlensize, prevlen);while(prevlen >0&& index--){
p -= prevlen;ZIP_DECODE_PREVLEN(p, prevlensize, prevlen);}}// 正向遍历}else