DoubleLinkedList獨立實現,不依賴任何包
class Node<E> {
E element;
Node prev;
Node next;
public Node(E element) {
//constructor with args
this.element = element;
}
public Node() {
//constructor without args
}
@Override
return this.element.toString();
}
}
private Node first = null;
private Node last = null;
/**
* 連結結點到連結串列首部
* @param node
*/
private void linkFirst(Node node) {
if (first == null || last == null) {
first = last = node;
}
node.next
first.prev = node;
first = node;
}
/**
* 連結結點到連結串列尾部
* @param node
*/
private void linkLast(Node node) {
last.next = node;
node.prev = last;
last = node;
}
/**
* 連結一個結點到連結串列中間
* @param node1 要連結的結點
* @param node2 連結點位置的結點
* [插入前]node -> node2 -> node3
* [插入後]node -> node1 -> node2 -> node3
*/
private void link(Node node1, Node node2) {
Node node = node2.prev;
node.next = node1;
node1.prev = node;
node1.next = node2;
node2.prev = node1;
}
/**
* 移除某個節點
* @param node
*/
public void unlink(Node node) {
Node prevNode = node.prev;
Node nextNode = node.next;
prevNode.next = nextNode;
nextNode.prev = prevNode;
}
/**
* 移除首結點
*/
private void unlinkFirst() {
first = first.next;
first.prev = null;
}
/**
* 移除尾結點
*/
private void unlinkLast() {
last = last.prev;
last.next = null;
}
/**
* 根據索引獲取結點
* @param index
* @return
*/
private Node getNode(int index) {
Node node = first;
Node currentNode = new Node();
if (index == 0) {
currentNode = first;
}
if (index >= size()) {
throw new IndexOutOfBoundsException(errMessage(index));
}
else {
int i = 0;
while (i <= index) {
if (node != null) {
currentNode = node;
node = node.next;
}
i++;
}
}
return currentNode;
}
/**
* 統計連結串列裡面所有元素的個數
* @return 總的元素的個數
*/
public int size() {
Node node = first;
int count = 0;
while (node != null) {
count++;
node = node.next;
}
return count;
}
/**
* 錯誤訊息顯示
* @param index
* @return
*/
private String errMessage(int index) {
return "Size: "+ size() + ", index: "+ index;
}
/**
* 插入元素到連結串列中
* @param index
* @param element
*/
public void insert(int index, E element) {
Node node = new Node<E>(element);
if (index == 0) {
linkFirst(node);
}
if (index < 0 || index >= size()) {
throw new IndexOutOfBoundsException(errMessage(index));
}
if (index == size() -1) {
linkLast(node);
}
else {
Node node1 = getNode(index);
link(node, node1);
}
}
/**
* 新增元素到連結串列
* @param element
*/
public void add(E element) {
Node node = new Node<E>(element);
linkFirst(node);
}
/**
* 新增元素到連結串列首部
* @param element
*/
public void addFirst(E element) {
Node node = new Node<E>(element);
linkFirst(node);
}
/**
* 新增元素到連結串列尾部
* @param element
*/
public void addLast(E element) {
Node node = new Node<E>(element);
linkLast(node);
}
/**
* 移除指定索引下得元素
* @param index
*/
public void remove(int index) {
if (index == 0) {
unlinkFirst();
}
else if (index == size() -1 ){
unlinkLast();
}
else if (index < 0 || index >= size()) {
throw new IndexOutOfBoundsException(errMessage(index));
}
else {
Node node = getNode(index);
unlink(node);
}
}
/**
* 移除最後一個元素
*/
public void removeLast() {
unlinkLast();
}
/**
* 移除第一個元素
*/
public void removeFirst() {
unlinkFirst();
}
/**
* 清空連結串列
*/
public void clear() {
first = null;
}
/**
* 判斷連結串列是否為空
* @return
*/
public boolean isEmpty() {
return first == null;
}
/**
* 過載toString方法
* @return
*/
@Override
public String toString() {
Node node = first;
StringBuilder stringBuilder = new StringBuilder();
if (node == null) {
return "{}";
}
else {
stringBuilder.append("{ ");
while (node != null) {
stringBuilder.append("["+ node.toString() +"],");
node = node.next;
}
}
String result = stringBuilder.toString();
int index = result.lastIndexOf(",");
return result.substring(0, index) + " }";
}
/**
* 判斷某個元素是否在連結串列中
* @param element
* @return
*/
public boolean contains(E element) {
return getIndexOf(element) != -1;
}
/**
* 獲取一個元素
* @param index
* @return
*/
public E get(int index) {
return (E) getNode(index).element;
}
/**
* 獲取最後一個元素
* @return
*/
public E getLast() {
return (E) last.element;
}
/**
* 獲取第一個元素
* @return
*/
public E getFirst() {
return (E) first.element;
}
/**
* 替換特定索引的元素
* @param index
* @param element
*/
public void replace(int index, E element) {
getNode(index).element = element;
}
/**
* 獲取某個元素的索引,這裡通常是第一次出現的索引
* @param element
* @return
*/
public int getIndexOf(E element) {
int index = 0;
if (element == null) {
for (Node<E> node = first; node != null; node = node.next) {
if (node.element == null) {
return index;
}
index++;
}
}
else {
for (Node<E> node = first; node != null; node = node.next) {
if (node.element.equals(element)) {
return index;
}
index++;
}
}
return -1;
}
/**
* 獲取某個元素最後一次出現的索引
* @param element
* @return
*/
public int getLastIndexOf(E element) {
int index = size();
if (element == null) {
for (Node<E> node = last; node != null; node = node.prev) {
index--;
if (node.element == null) {
return index;
}
}
}
else {
for (Node<E> node = last; node != null; node = node.prev) {
index--;
if (node.element.equals(element)) {
return index;
}
}
}
return -1;
}
/**
* 移除某個元素第一次出現的位置
* @param element
*/
public void removeFirstOccurrence(E element) {
if (element == null) {
return;
}
int index = getIndexOf(element);
remove(index);
}
/**
* 移除某個元素最後一次出現的位置
* @param element
*/
public void removeLastOccurrence(E element) {
if (element == null) {
return;
}
int index = getLastIndexOf(element);
remove(index);
}
相關推薦
DoubleLinkedList獨立實現,不依賴任何包
public class DoubleLinkedList<E> { class Node<E> { E element; Node prev; Node next; public Node(E element)
java最簡單複製檔案方法,不依賴任何框架
java最簡單複製檔案方法 把java2.txt內容複製到java.txt中 import java.io.File; import java.io.IOException; import java.nio.file.Files; im
不依賴任何系統API,用c語言實現gbk/utf8/unicode編碼轉換
轉載地址:https://blog.csdn.net/bladeandmaster88/article/details/54837338 漢字'我' Unicode編碼是0x6211 01100010 00010001 UTF8編碼是&
微信瀏覽器內,不需任何操作,直接啟動外部瀏覽器是怎麼實現的
做微信營銷活動或者APK下載推廣時候,域名被經常被封,做到微信中正常使用呢?這就要藉助一些工具來實現有效的操作。先來認識一下微信遮蔽的原理。按原理逐個攻破,本人做防封一年來自認為得心應手 工具介紹: 月牙跳轉是一款基於微信後端開發了一款微信營銷下載推廣助手,使用了本外掛生成的連結,使用者在微信任意環境下點
ffmpeg實戰教程(十一)手把手教你實現直播功能,不依賴第三方SDK
先上圖: 推流的手機 拉流的網頁和VL播放器 拉流的手機客戶端 對於nginx伺服器的搭建之前有寫過: 這篇也建議看一下: 下面開始實現手機直播功能 1
div/dom元素拖拽縮放外掛,純js實現拖拽縮放,不依賴jQuery~
產品需求,需要用到對div(dom)進行拖拽縮放操作,看到有好多外掛,要麼依賴jQuery,要麼檔案太大。 封裝了一個外掛,不壓縮狀態下5KB。 html <!DOCTYPE html> <html lang="en"> <head> <
在Excel中,不利用任何第三方工具,生成二維碼
pdf ng- ref mac 源碼 generated code 而是 git 有同事提需求,要批量生成二維碼。談了之後,我覺得可以做個excel文件,把要打印的內容放進去,然後給每行數據生成一個二維碼。下一步就要在Excel裏面生成二維碼。問了一下度娘,貌似都得利用一些
phpmyadmin-錯誤:配置文件權限錯誤,不應任何用戶都能修改!這裏有答案
highlight 文字 所有權限 配置文件 inux style true 所有 整理 今天在linux下使用phpMyadmin的時候突然出現這個紅色警告。差點把我嚇暈在電腦前。不過冷靜想一下這個報錯,肯定就是linux權限那幾個 ‘7’ 惹的禍。 於是 通過命令
無限極結構循環,不適用任何數組函數,一次循環,並根據給出的root 快速篩選
PHP 無限極分類 一次循環 不使用任何函數 <?php$nodesArrays = [[‘id‘ => 1, ‘pid‘ => 0, ‘name‘ => ‘a‘],[‘id‘ => 2, ‘pid‘ => 0, ‘name‘ => ‘b‘],[‘id
spring-boot-2.0.3之redis快取實現,不是你想的那樣哦!
前言 開心一刻 小白問小明:“你前面有一個5米深的坑,裡面沒有水,如果你跳進去後該怎樣出來了?”小明:“躺著出來唄,還能怎麼出來?”小白:“為什麼躺著出來?”小明:“5米深的坑,還沒有水,跳下去不死就很幸運了,殘是肯定會殘的,不躺著出來,那能怎麼出來?”小白:“假設沒死也沒殘呢?”小明:“你當
spring-boot-2.0.3之redis快取實現,不是你想的那樣哦
前言 開心一刻 小白問小明:“你前面有一個5米深的坑,裡面沒有水,如果你跳進去後該怎樣出來了?”小明:“躺著出來唄,還能怎麼出來?”小白:“為什麼躺著出來?”小明:“5米深的坑,還沒有水,跳下去不死就很幸運了,殘是肯定會殘的,不躺著出來,那能怎麼出來?”小白:“假設沒死也沒殘呢?”小明:“你當我超
tomcat配置指定啟動jdk版本,不依賴環境變數
1.windows下 開啟tomcat解壓目錄下的\bin\setclasspath.bat檔案,在指令碼開始新增下面兩行設定 set JAVA_HOME=D:\Program Files\Java\jdk8\jdk1.8.0_50 set JRE_HOME=D:\Program Files\Jav
神奇的css3,不寫任何邏輯也能做選項卡切換
相信大家做選項卡切換的時候都是用js或者jq完成的,但是有沒有想過,樣式表也能直接做呢? 今天就教大家如何實現, 主要是用到一些css3的屬性, 基礎操作,先佈局 <label> <input type="radio" name
關於IE8不支援placeholder完美解決方案,不需要任何外掛
最近有好多人諮詢我IE8不支援placeholder的問題,自己寫了一個demo以供參考。 js部分 1 function input_focus(e){ 2 $(e).css("color","#000000"); 3 if($(e).val()=="請輸入文字"){ 4
Android控制手電筒程式碼,簡單易用,不需要任何許可權
1.控制手電筒開關的工具類:public class FlashUtils { private CameraManager manager; private Camera mCamera = null; private Context context;
Struts2配置,本地載入DTD,不依賴聯網
在eclipse/myeclipse中,可以在“設定”中關聯本地dtd,具體如下圖 但是這種方式離開ide關聯性應該就失效了(未驗證,猜的),個人覺得更好的方法是直接在xml標頭檔案聲明裡就指向本地,而不是網路地址,搜了下,具體做法是將PUBLIC改為SYSTEM,網路
mvc中,不適用任何table表格樣式進行標題(table的首行)的固定展示
效果圖: 1.table的格式 <div class='Table-Cont' id='Table-Cont'> <table class="table table-res
Android 2個Service實現相互保活,通過bindservice來實現,不通過廣播實現
1,實現原理:啟動2個Service,相互繫結監聽,當A Service監聽到連線斷開的時候,說明B服務可能被 Kill掉了,這時需要重新開啟A服務,同樣B服務的監聽斷掉了,重新啟動A服務。A,B兩個服務都是單獨的程序,需要使用AIDL來通訊。 2,A服務原始碼: public class
perl 將檔案複製到另一個檔案,不做任何改動。
最近一直都在用perl寫東西,感覺perl用起來很舒服,而且規範不是那麼嚴格,很喜歡! 例子:將檔案複製到另一個檔案,不做任何改動。(如果有perl的問題,歡迎提問,大家一起討論) $input = @ARGV[0]; $output = @ARGV[1]; open INPUT, $inpu
最簡單的java獲取微信小程式openid的方法,不需要jar包
@RequestMapping("getUserOpenId") @ResponseBody public String getUserOpenId(String appid, String js_code, String secret) {// System.out.println("appid"+app