java中的跳过列表删除和打印方法
我致力于用java实现跳过列表。我有一个插入和搜索的方法。但我不能写删除和打印方法。下面是代码:SkipList.javajava中的跳过列表删除和打印方法,java,linked-list,skip-lists,Java,Linked List,Skip Lists,我致力于用java实现跳过列表。我有一个插入和搜索的方法。但我不能写删除和打印方法。下面是代码:SkipList.java public class SkipList<T extends Comparable<T>> { private SkipNode<T> start; private SkipNode<T> end; private SkipNode<T> supportStart; pr
public class SkipList<T extends Comparable<T>> {
private SkipNode<T> start;
private SkipNode<T> end;
private SkipNode<T> supportStart;
private SkipNode<T> supportEnd;
private int size;
private int sizeSupport;
public T getStart() {
return start.getData();
}
public T getEnd() {
return end.getData();
}
public int getSize() {
return size;
}
public void add(T data) {
if (start == null) {
insertAsFirstElement(data);
} else {
insert(data);
}
}
private void insertAsFirstElement(T data) {
SkipNode<T> node = new SkipNode<>(data);
start = node;
end = node;
size++;
SkipNode<T> supportNode = new SkipNode<>(data);
supportStart = supportNode;
supportEnd = supportNode;
supportNode.setDown(node);
sizeSupport++;
}
//Adding element in the end assuming user enters data in ascending order
private void insert(T data) {
SkipNode<T> node = new SkipNode<>(data);
end.setNext(node);
node.setPrevious(end);
end = node;
size++;
int expectedSupportSize = (int) Math.sqrt(size);
if (sizeSupport < expectedSupportSize) {
SkipNode<T> supportNode = new SkipNode<>(data);
supportEnd.setNext(supportNode);
supportNode.setPrevious(supportEnd);
supportEnd = supportNode;
supportNode.setDown(node);
sizeSupport++;
if (sizeSupport > 2) {
reAjustSupportList();
}
}
}
private void reAjustSupportList() {
SkipNode<T> navigationNode = supportStart.getNext();
int i = 1;
while (navigationNode != supportEnd) {
SkipNode<T> tempNode = navigationNode.getDown();
for (int j = 1; j <= i; j++) {
tempNode = tempNode.getNext();
}
navigationNode.setDown(tempNode);
navigationNode.setData(tempNode.getData());
navigationNode = navigationNode.getNext();
i++;
}
}
public boolean search(T data) {
SkipNode<T> navigationNode = supportStart;
int compare;
while ((compare = data.compareTo(navigationNode.getData())) > 0
&& navigationNode.getNext() != null) {
navigationNode = navigationNode.getNext();
}
if (compare == 0) {
return true;
}
if (compare < 0) {
navigationNode = navigationNode.getPrevious();
}
navigationNode = navigationNode.getDown().getNext();
while ((compare = data.compareTo(navigationNode.getData())) > 0
&& navigationNode.getNext() != null) {
navigationNode = navigationNode.getNext();
}
return compare == 0;
}
private static class SkipNode<T> {
public SkipNode(T data) {
this.data = data;
}
private SkipNode<T> next = null;
private SkipNode<T> previous = null;
private SkipNode<T> down = null;
private T data;
public SkipNode<T> getNext() {
return next;
}
public void setNext(SkipNode<T> next) {
this.next = next;
}
public SkipNode<T> getPrevious() {
return previous;
}
public void setPrevious(SkipNode<T> previous) {
this.previous = previous;
}
public SkipNode<T> getDown() {
return down;
}
public void setDown(SkipNode<T> down) {
this.down = down;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
public static void main(String[] args) {
SkipList<Integer> mylist = new SkipList<Integer>();
mylist.add(12);
mylist.add(23);
mylist.add(30);
mylist.add(20);
mylist.add(45);
mylist.add(34);
System.out.println("Size of liked list equals:"+ mylist.size);
System.out.println(mylist.search(12)); // true
System.out.println(mylist.search(45)); //true
System.out.println(mylist.search(40)); // false
}
}
公共类SkipList{
专用SkipNode启动;
私有SkipNode端;
私有SkipNode支持启动;
私有SkipNode支持端;
私有整数大小;
私有整数支持;
公共T getStart(){
返回start.getData();
}
公共T getEnd(){
返回end.getData();
}
公共int getSize(){
返回大小;
}
公共无效添加(T数据){
if(start==null){
插入文件(数据);
}否则{
插入(数据);
}
}
专用void insertAsFirstElement(T数据){
SkipNode节点=新SkipNode(数据);
开始=节点;
结束=节点;
大小++;
SkipNode supportNode=新的SkipNode(数据);
supportStart=supportNode;
supportEnd=supportNode;
supportNode.setDown(节点);
sizeSupport++;
}
//假设用户按升序输入数据,则在末尾添加元素
专用无效插入(T数据){
SkipNode节点=新SkipNode(数据);
end.setNext(节点);
node.setPrevious(结束);
结束=节点;
大小++;
int expectedSupportSize=(int)Math.sqrt(size);
if(大小支持<预期支持大小){
SkipNode supportNode=新的SkipNode(数据);
supportEnd.setNext(supportNode);
supportNode.setPrevious(supportEnd);
supportEnd=supportNode;
supportNode.setDown(节点);
sizeSupport++;
如果(大小支持>2){
reAjustSupportList();
}
}
}
私有void reAjustSupportList(){
SkipNode navigationNode=supportStart.getNext();
int i=1;
while(navigationNode!=supportEnd){
SkipNode tempNode=navigationNode.getDown();
对于(int j=1;j 0
&&navigationNode.getNext()!=null){
navigationNode=navigationNode.getNext();
}
如果(比较==0){
返回true;
}
如果(比较<0){
navigationNode=navigationNode.getPrevious();
}
navigationNode=navigationNode.getDown().getNext();
而((compare=data.compareTo(navigationNode.getData()))>0
&&navigationNode.getNext()!=null){
navigationNode=navigationNode.getNext();
}
返回比较==0;
}
私有静态类SkipNode{
公共SkipNode(T数据){
这个数据=数据;
}
private SkipNode next=null;
private SkipNode previous=null;
private SkipNode down=null;
私有T数据;
公共SkipNode getNext(){
下一步返回;
}
public void setNext(SkipNode next){
this.next=next;
}
公共SkipNode getPrevious(){
返回上一个;
}
public void setPrevious(SkipNode previous){
this.previous=先前;
}
公共SkipNode getDown(){
返回下来;
}
公共无效设置(SkipNode down){
this.down=向下;
}
公共T getData(){
返回数据;
}
公共无效设置数据(T数据){
这个数据=数据;
}
}
公共静态void main(字符串[]args){
SkipList mylist=新SkipList();
mylist.add(12);
mylist.add(23);
增加(30);
添加(20);
mylist.add(45);
mylist.add(34);
System.out.println(“喜欢的列表的大小等于:“+mylist.Size”);
System.out.println(mylist.search(12));//true
System.out.println(mylist.search(45));//true
System.out.println(mylist.search(40));//false
}
}
我试图通过打印获得的列表
for(int i=1;i<mylist.size;i++)
{
System.out.println(mylist[i]);
}
for(int i=1;i为什么你在1开始i
呢?那是一个打字错误,是的,我改了,但它不起作用。我怎么写那些方法呢?你能帮我吗?你为什么在1开始i
呢?那是一个打字错误,是的,我改了,但它不起作用。我怎么写那些方法呢?你能帮我吗?