手搓跳表 SkipList

2021-10-23 19:52:50 字數 1799 閱讀 7277

public class skiplist 

/*** 查詢資料

** @param data

* @return

*/public node search(int data)

return res;

}/**

* 通過data來查詢節點

** @param data

* @return

*/private node findnode(int data)

if (curnode.down == null)

curnode = curnode.down;

}return curnode;

}/**

* 插入資料

** @param data

*/public void insert(int data)

//不存在,進行插入

node node = new node(data);

addnodetonext(prenode,node);

int curlevel = 0;

while (math.random() > promote_rate)

incrlevel();

}while (prenode.up == null)

prenode = prenode.up;

node indexnode = new node(data);

addnodetonext(prenode, indexnode);

node.up = indexnode;

indexnode.down = node;

node = indexnode;

curlevel++;}}

/*** 刪除資料

** @param data

* @return

*/public boolean delete(int data)

//存在則刪除

removenode(node,0);

int curlevel = 1;

while ((node = node.up) != null)

return true;

}/**

* 刪除乙個節點

** @param node

*/private void removenode(node node,int curlevel)

}/**

* 從該層降級

*/private void decrlevel(int curlevel,node first,node last)

/*** 按順序列印skiplist的所有資料

*/public void printlist()

node = node.next;

while(node.data!= integer.max_value)

system.out.println();

}/**

* 新增乙個節點到指定節點的右側

** @param prenode

* @param node

*/public void addnodetonext(node prenode, node node)

/*** 增加一層索引

*/public void incrlevel()

/*** 跳表中的節點

*/class node

}public static void main(string args)

}

參考:對其刪除操作做了一定的優化,對其增加層次的操作做了限制。

跳表skiplist相關

基於字典的跳表實現 include include include include include using namespace std template struct skipnode template class dictionary virtual bool empty const 0 vi...

資料結構 跳表(Skip List)

從頂層鍊錶的首元素開始,從左往右搜尋,知道找到乙個大於或等於目標的元素,或者到達當前層鍊錶的尾部 如果該元素等於目標元素,則表明該元素已被找到 如果該元素大於目標元素或已到達鍊錶的尾部,則退回到當前層的前乙個元素,然後轉入下一層進行搜尋 新節點的層數 int newlevel randomlevel...

SkipList跳表記錄一下

節點擁有鍵和值,並按排序單獨鏈結順序,可能帶有一些中間的標記節點。清單是以可作為head.node訪問的虛擬節點為首。值字段僅宣告為object,因為它需要特殊的非v標記和標頭節點的值。static final class node 索引節點代表跳過列表的級別。注意即使節點和索引都具有前向指向字段,...