資料結構之雙向連結串列(JAVA實現)
歡迎轉載,請附出處:
http://blog.csdn.net/as02446418/article/details/47114711
最近重新複習了一些基礎的資料結構,發覺自己好多已經淡忘了,索性重新撿起來以前的知識,今天筆者回顧了一下連結串列的知識,用JAVA實現了一個雙向連結串列,下面來看程式碼:
public class DoubleLinkedList
{
// 節點類Node
private static class Node
{
Object value;
Node prev = this;
Node next = this ;
Node(Object v)
{
value = v;
}
public String toString()
{
return value.toString();
}
}
private Node head = new Node(null); // 頭節點
private int size; // 連結串列大小
// 以下是介面方法
//新增到連結串列表頭
public boolean addFirst(Object o)
{
addAfter(new Node(o), head);
return true;
}
//將元素新增到連結串列表尾
public boolean addLast(Object o)
{
addBefore(new Node(o), head);
return true;
}
public boolean add(Object o)
{
return addLast(o);
}
//將元素新增到指定位置
public boolean add(int index, Object o)
{
addBefore(new Node(o), getNode(index));
return true;
}
//移除指定位置
public boolean remove(int index)
{
removeNode(getNode(index));
return true;
}
//移除連結串列表頭元素
public boolean removeFirst()
{
removeNode(head.next);
return true;
}
//移除連結串列表尾元素
public boolean removeLast()
{
removeNode(head.prev);
return true;
}
//取到指定位置的元素值
public Object get(int index)
{
return getNode(index).value;
}
//返回連結串列的大小
public int size()
{
return size;
}
public String toString()
{
StringBuffer s = new StringBuffer("[");
Node node = head;
for (int i = 0; i < size; i++)
{
node = node.next;
if (i > 0)
s.append(", ");
s.append(node.value);
}
s.append("]");
return s.toString();
}
//以下是實現方法
//查詢連結串列元素
private Node getNode(int index)
{
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException();
Node node = head.next;
for (int i = 0; i < index; i++)
node = node.next;
return node;
}
//在某元素之前新增元素
private void addBefore(Node newNode, Node node)
{
newNode.prev = node.prev;
newNode.next = node;
newNode.next.prev = newNode;
newNode.prev.next = newNode;
size++;
}
//在某元素之後新增元素
private void addAfter(Node newNode, Node node)
{
newNode.prev = node;
newNode.next = node.next;
newNode.next.prev = newNode;
newNode.prev.next = newNode;
size++;
}
//移除特定元素
private void removeNode(Node node)
{
node.next.prev = node.prev;
node.prev.next = node.next;
node.prev = null;
node.next = null;
size--;
}
}
//有些地方還可以優化,比如查詢時可以判斷索引是否大於size的一半,如果是的話,就從另一頭開始迭代。
測試類:
public class Test
{
public static void main(String[] args)
{
DoubleLinkedList dll = new DoubleLinkedList();
//新增
dll.add("A");
dll.add("B");
dll.add("C");
System.out.println(dll);
//新增到最前
dll.addFirst("D");
System.out.println(dll);
//新增到最後
dll.addLast("E");
System.out.println(dll);
//新增到指定位置
dll.add(4, "F");
System.out.println(dll);
//移除最前的
dll.removeFirst();
System.out.println(dll);
//移除最後的
dll.removeLast();
System.out.println(dll);
//移除指定位置上的
dll.remove(2);
System.out.println(dll);
//返回指定位置上的元素
System.out.println(dll.get(1));
}
}
Java實現的連結串列和c/c++有點不一樣的地方是c/c++用的是指標,而Java用的是引用,這裡的區別希望大家注意一下。
相關推薦
資料結構之雙向連結串列(JAVA實現)
歡迎轉載,請附出處: http://blog.csdn.net/as02446418/article/details/47114711 最近重新複習了一些基礎的資料結構,發覺自己好多已經淡忘了,索性重新撿起來以前的知識,今天筆者回顧了一下連結串列的知識,用J
Java手寫LinkedList 應用資料結構之雙向連結串列
作為Java程式設計師,紮實的資料結構演算法能力是必須的 LinkedList理解的最好方式是,自己手動實現它 ArrayList和LinkedList是順序儲存結構和鏈式儲存結構的表在java語言中的實現. ArrayList提供了一種可增長陣
資料結構-連結串列(java實現)
/** * 連結串列節點定義 * */ private class Node { private Object data; private Node next; public Node getNext() { return next;
1.6 python資料結構之雙向連結串列/迴圈連結串列——以OrderedDict資料結構為例
在連結串列這一部分的最後,我們以python中十分強大的collections包中的OrderedDict為例,看一下雙向迴圈列表的功能實現。 OrderedDict 它提供了有序的dict結構,因此他不是常規的雜湊雜湊表,為了保證儲存物件有序,它用連結串列實現了這一功能,
資料結構之單向連結串列(C++語言描述)
該檔案是整個原始檔,包括單向連結串列節點的定義,各種操作函式,main()測試用例。 #include <iostream> using namespace std; struct ListNode //用class時需要加publi
資料結構---自定義單向連結串列(Java實現)
單向連結串列是指每一個節點記憶體在一個指向下一個節點的指標,java中就是節點存在指向下一個節點的物件引用 下面是Node節點類 public class Node { private Object object; private Node next;
資料結構-雙向連結串列(Python實現)
資料結構在程式設計世界中一直是非常重要的一環,不管是開發還是演算法,哪怕是單純為了面試,資料結構都是必修課,今天我們介紹連結串列中的一種——雙向連結串列的程式碼實現。 好了,話不多說直接上程式碼。 雙向連結串列 首先,我們定義一個節點類:Node class Node: def __init__(se
劍指offer之從尾到頭列印連結串列(Java實現)
從尾到頭列印連結串列 NowCoder 題目描述: 輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 ###解題思路: 解法一:利用遞迴 import java.util.ArrayList; public class Solution {
UVA-12657 Boxes in a Line (模擬,雙向連結串列(陣列實現))
第一次對陣列實現雙向連結串列的練習,理解了發現數組實現真方便… 題目:UVA-12657 題目描述: 你有n個盒子在桌子上的一條線上從左到右編號為1……n。你的任務是模擬四種操作 1 X Y 移動盒子編號X到盒子編號Y的左邊(如果X已經在Y的左邊了就忽略) 2 X Y 移
LeetCode第23題:合併K個有序連結串列(JAVA實現)
題目: 我的解答: 思路很簡單,把所有的資料先讀到ArrayList中然後轉到陣列中,然後排序,然後構建新連結串列 程式碼: /** * Definition for singly-linked list. * public class ListNode {
leetcode206. 反轉連結串列(java實現)
題目:反轉一個單鏈表。 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL 思路: 迭代:讓當前節點的下一個節點是前節點,然後當前節點和下一個節點分別往後移。
劍指offer面試題6:從尾到頭列印連結串列(Java實現)
題目:輸入一個連結串列的頭結點,從尾到頭反過來打印出每個結點的值。 思路:因為要實現從頭到尾遍歷,然後從尾到頭列印,也就是說第一個遍歷到的最後一個列印,最後遍歷到的第一個列印,這很明顯符合棧 “先進後出” 的特點,所以我們可以利用棧來實現這種順序。 測試用例: 功能測試:
雙向連結串列(c++實現)
單向連結串列的缺點:逆序訪問單向連結串列中的資料元素,效率低下。 若從頭節點開始依次訪問單向連結串列的元素,可使用m_current遊標,但是逆序訪問,只能通過下面程式碼實現訪問: int main(void) { LinkList<i
(超詳細)動手編寫-連結串列(Java實現)
[TOC] ## 前言 在前面的實現的動手寫個Java動態數組裡,雖然對於使用者而言,看是實現了動態擴容的功能,實際上,只是依託底層寫的方法`ensureCapacity`在陣列容量不足的時候,對重新申請一個原陣列1.5倍容量的新陣列,再將原有陣列中存放的元素複製到新陣列來,陣列指標指向新陣列,從根本上來說
(超詳細) 動手編寫 — 連結串列 (Java實現)
[TOC] ## 前言 在前面的實現的動手寫個Java動態數組裡,雖然對於使用者而言,看是實現了動態擴容的功能,實際上,只是依託底層寫的方法`ensureCapacity`在陣列容量不足的時候,對重新申請一個原陣列1.5倍容量的新陣列,再將原有陣列中存放的元素複製到新陣列來,陣列指標指向新陣列,從根本上來說
大話資料結構(四)——雙向連結串列的java實現
在實現了單向連結串列後,我們在使用單向連結串列中會發現一個問題:在單向連結串列中查詢某一個結點的下一個結點的時間複雜度是O(1),但是查詢這個結點的上一個結點的時候,時間複雜度的最大值就變成了O(n),因為在查詢這個指定結點的上一個結點時又需要從頭開始遍歷。 那麼該如何解決這個困難呢?
Redis系列(八):資料結構List雙向連結串列中阻塞版本之BLPOP、BRPOP和LINDEX、LINSERT、LRANGE命令詳解
1.BRPOP、BLPOP BLPOP: BLPOP 是阻塞式列表的彈出原語。 它是命令 LPOP 的阻塞版本,這是因為當給定列表內沒有任何元素可供彈出的時候, 連線將被 BLPOP 命令阻塞。 當給定多個 key 引數時,按引數 key 的先後順序依次檢查
Java版資料結構之迴圈連結串列的實現
簡介 在指定結點後新增一個結點 刪除指定結點的下一個結點 獲取下一個結點 獲取結點資料 public class LoopNode { int data;//資料域 LoopNode next;//下一個結點 public Loop
C語言資料結構之靜態連結串列實現(A-B)U(B-A)
時間複雜度O(3n)不是很難,直接貼程式碼:StaticLinkList.h#ifndef _STATIC_LINK_LIST_H_ #define _STATIC_LINK_LIST_H_ #define MAXSIZE 100 typedef enum {ERROR,OK
Redis系列(五):資料結構List雙向連結串列中基本操作操作命令和原始碼解析
1.介紹 Redis中List是通過ListNode構造的雙向連結串列。 特點: 1.雙端:獲取某個結點的前驅和後繼結點都是O(1) 2.無環:表頭的prev指標和表尾的next指標都指向NULL,對連結串列的訪問都是以NULL為終點 3.帶表頭指標和表尾指標:獲取表頭和表尾的複雜度都是O(1) 4.帶連結串