Unrolled LinkedList
Given an unrolled linked list implement a get method/function. Write tests for your function. Explain complexity in O(n) of your function. Write a put function.
public class UnrolledList {
public Node root;
int totalLen;
public UnrolledList(){
this.root = new Node();
}
class Node{
char[] chars;
int len;
Node next;
public Node(){
this.chars = new char[5];
}
}
// index表示是当前的第几个元素,len是整个list中元素的数目
public char get(int index){
Node node = list.head;
int total = list.totalLen;
if(node == null || total <= 0 || index > total){
return ' ';
}
while(node!=null && node.len < index){
index -= node.len;
node = node.next;
}
if(node == null){
return ' ';
}
return node.chars[index - 1];
}
// index 表示是当前的第几个元素,len是整个list中元素的数目
public void insert(char ch, int index){
Node node = list.head;
Node pre = null;
int total = list.totalLen;
if((node == null || total == 0) && index == 1){
head = new Node();
head.chars[0] = ch;
head.len = 1;
total = 1;
return;
}
if(node == null || total == 0 || index > total + 1){
return ;
}
while(node!=null && node.len < index){
index -= node.len;
pre = node;
node = node.next;
}
if( node == null){
node = new Node();
node.chars[index] = ch;
node.len = 1;
total = total + 1;
pre.next = node;
return;
}
if(node.len < 5) {
for(int i = node.len - 1; i>=index; i--){
node.chars[i] = node.chars[i-1];
}
node.chars[index - 1] = ch;
node.len ++;
} else {
Node newNode = new Node();
newNode.len = 5 - index;
for(int i = 0 ; i < newNode.len; i++){
newNode.chars[i] = node.chars[ index - 1 + i];
node.chars[index - 1 + i] =' ';
}
node.chars[index - 1] = ch;
node.len= index;
newNode.next = node.next;
node.next = newNode;
}
}
// 0 based index 0 based,len也是长度
public char get(int index){
int i = index + 1;
Node node = list.head;
int total = list.totalLen;
if(node == null || total < 0 || i > total){
return ' ';
}
Node pre = null;
while(node!=null && node.len < i){
pre = node;
i -= node.len;
node = node.next;
}
if(node == null){
return ' ';
}
return node.chars[i - 1];
}
public void insert(char ch, int index){
index++;
Node node = list.head;
int total = list.totalLen;
if(node == null || total < 0 || index > total + 1){
return ;
}
while(node!=null && node.len < index){
index -= node.len;
node = node.next;
}
if( node == null){
node = new Node();
node.chars[index] = ch;
node.len = 1;
total = total + 1;
pre.next = node;
return;
}
if(node.len < 5) {
for(int i = node.len; i>=index; i--){
node.chars[i] = node.chars[i-1];
}
node.chars[index - 1] = ch;
} else {
Node newNode = new Node();
newNode.len = 5 - index;
for(int i = 0; i<newNode.len; i++){
newNode.chars[i] = node.chars[ index - 1 + i];
node.chars[index - 1 + i] =' ';
}
node.chars[index - 1] = ch;
node.len= index;
newNode.next = node.next;
node.next = newNode;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}