1. 程式人生 > >雙向連結串列簡單實現--資料結構與演算法紀錄片第一記

雙向連結串列簡單實現--資料結構與演算法紀錄片第一記

  從這個月開始得準備春招的東西,所以打算重新學習資料結構與演算法,以後的部落格就以這個為主。

  今天是線性結構中的雙向連結串列。

  程式碼實現與測試:

  DoubleLinkNode: 

package linear.doublelink;

/**
* @Description: 連結串列節點結構體
* @Auther: Weijie.Zhang
* @Date: 2018/11/1 17:03
*/
public class DoubleLinkNode<T> {
public T value;
public DoubleLinkNode pre;
public DoubleLinkNode next;

public DoubleLinkNode(T value) {
this.value = value;
}

public DoubleLinkNode(T value, DoubleLinkNode pre, DoubleLinkNode next) {
this.value = value;
this.pre = pre;
this.next = next;
}
}

DoubleLink:
package linear.doublelink;

/**
* @Description: 連結串列實現
* @Auther: Weijie.Zhang
* @Date: 2018/11/1 17:04
*/
public class DoubleLink<T> {
//表頭
private DoubleLinkNode<T> head;
//節點個數
private int count;

public DoubleLink() {
head = new DoubleLinkNode<T>(null, null, null);
head.pre = head.next = head;
count = 0;
}

//返回節點個數
public int size() {
return count;
}

//返回連結串列是否為空
public Boolean isEmpty() {
if (count == 0) {
return true;
} else {
return false;
}
}

//獲取第index位置上的節點
public DoubleLinkNode<T> get(int index) {
if (index < 0 || index >= count) {
System.out.println("索引超出範圍");
throw new IndexOutOfBoundsException();
}

//正向查詢
if (index <= count / 2) {
DoubleLinkNode doubleLinkNode = head.next;
for (int i = 0; i < index; i++)
doubleLinkNode = doubleLinkNode.next;
return doubleLinkNode;
}

//反向查詢
DoubleLinkNode doubleLinkNode = head.pre;
int pos = count - index - 1;
for (int i = 0; i < pos; i++)
doubleLinkNode = doubleLinkNode.pre;
return doubleLinkNode;
}

//獲取第一個節點的值
public T getFirstValue() {
return get(0).value;
}

//獲取最後一個節點的值
public T getLastValue() {
return get(count - 1).value;
}

//獲取第index節點的值
public T getIndexValue(int index) {
return get(index).value;
}

//將節點插入到index位置
public void insert(int index, DoubleLinkNode<T> doubleLinkNode) {
if (index < 0 || index > count) {
System.out.println("超出索引範圍");
throw new IndexOutOfBoundsException();
}

if (index == 0) {
head.next.pre = doubleLinkNode;
head.next = doubleLinkNode;
count++;
return;
}

if (index == count) {
doubleLinkNode.next = head;
doubleLinkNode.pre = head.pre;
head.pre.next = doubleLinkNode;
head.pre = doubleLinkNode;
count++;
return;
}

for (int i = 0; i < index; i++) {
DoubleLinkNode linkNode = get(index);
doubleLinkNode.pre = linkNode.pre;
doubleLinkNode.next = linkNode;
linkNode.pre.next = doubleLinkNode;
linkNode.pre = doubleLinkNode;
count++;
return;
}
}

//刪除index上的節點
public void delete(int index) {
DoubleLinkNode doubleLinkNode = get(index);
doubleLinkNode.pre.next = doubleLinkNode.next;
doubleLinkNode.next.pre = doubleLinkNode.pre;
count--;
return;
}

//修改index節點上的值
public void change(int index, T value) {
get(index).value = value;
return;
}
}

MainTest:
package linear.doublelink;

/**
* @Description: 測試
* @Auther: Weijie.Zhang
* @Date: 2018/11/1 17:57
*/
public class MainTest {
public static void main(String[] args) {
DoubleLink<Integer> doubleLink = new DoubleLink<>();
int i;
for (i = 0; i < 10; i++) {
DoubleLinkNode<Integer> doubleLinkNode = new DoubleLinkNode<>(i + 22);
doubleLink.insert(i, doubleLinkNode);
}
System.out.println(doubleLink.getFirstValue());
System.out.println(doubleLink.getLastValue());
System.out.println(doubleLink.getIndexValue(7));

doubleLink.delete(4);
doubleLink.insert(9,new DoubleLinkNode<Integer>(10));

for (int j = 0; j < doubleLink.size(); j++) {
System.out.print(doubleLink.get(j).value + " ");
}
}
}