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 索引節點代表跳過列表的級別。注意即使節點和索引都具有前向指向字段,...