數(shù)據(jù)結(jié)構(gòu)(一)數(shù)組實現(xiàn)一個簡單的ArrayList
數(shù)據(jù)結(jié)構(gòu)(二)鏈表實現(xiàn)LinkedList
數(shù)據(jù)結(jié)構(gòu)(三)用兩種方式簡單實現(xiàn)棧
數(shù)據(jù)結(jié)構(gòu)(四)棧和隊列的簡單應用
數(shù)據(jù)結(jié)構(gòu)(五)用兩種方式簡單實現(xiàn)隊列
數(shù)據(jù)結(jié)構(gòu)(六)BST二分搜索樹(上)
數(shù)據(jù)結(jié)構(gòu)(六)BST二分搜索樹(下)
數(shù)據(jù)結(jié)構(gòu)(七)兩種方式實現(xiàn)set
數(shù)據(jù)結(jié)構(gòu)(八)兩種方式實現(xiàn)map
數(shù)據(jù)結(jié)構(gòu)(九)set解決LeetCode349號問題
最近學習了鏈表垃帅,自己簡單實現(xiàn)了一個LinkedList,這里只是單鏈表剪勿,不過自己處理了一個虛擬頭節(jié)點贸诚,這樣遍歷的時候就比較省力。這里也是簡單的實現(xiàn)了幾個方法厕吉,add酱固,remove ,get头朱,set运悲,isempty,getsize项钮。
廢話不多下邊是源碼班眯。
package com.company;
public class DummyLinkedList<E> {
private class Node {
private E e;
private Node next;
public Node(E e, Node next) {
this.e = e;
this.next = next;
}
public Node(E e) {
this(e, null);
}
public Node() {
this(null, null);
}
@Override
public String toString() {
return e.toString();
}
}
private Node dummyHead;
private int size;
public DummyLinkedList() {
dummyHead = new Node(null, null);
size = 0;
}
//返回鏈表中的元素個數(shù)
public int getSize() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
//在鏈表index的位置添加新的元素e
// 在鏈表中不是一個常用操作,練習用:)
public void add(int index, E e) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("Add failed,Illegal index.");
}
Node prev = dummyHead;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
prev.next = new Node(e, prev.next);
size++;
}
//在鏈表頭添加一個元素
public void addFirst(E e) {
add(0, e);
}
// 在鏈表的末尾添加一個元素
public void addLast(E e) {
add(size, e);
}
/**
* 在鏈表中經(jīng)常使用虛擬頭結(jié)點寄纵。
*/
public E get(int index) {
if (index < 0 || index >= size)
throw new IllegalArgumentException("Add failed,Illegal index.");
Node cur = dummyHead.next;
for (int i = 0; i < index; i++) {
cur = cur.next;
}
return cur.e;
}
public E getFirst() {
return get(0);
}
public E getLast() {
return get(size - 1);
}
//從鏈表中刪除index位置的元素鳖敷,返回刪除的元素
// 從鏈表不是一個常用的操作,練習用
public E remove(int index) {
if (index < 0 || index >= size)
throw new IllegalArgumentException("Remove failed,Illegal index.");
Node prev = dummyHead;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
Node delNode = prev.next;
prev.next = delNode.next;
delNode.next = null;
size--;
return delNode.e;
}
public void set(int index, E e) {
if (index < 0 || index >= size)
throw new IllegalArgumentException("Add failed,Illegal index.");
Node cur = dummyHead.next;
for (int i = 0; i < index; i++) {
cur = cur.next;
}
cur.e = e;
}
public boolean contain(E e) {
Node cur = dummyHead.next;
while (cur != null) {
if (cur.e.equals(e)) {
return true;
} else {
cur = cur.next;
}
}
return false;
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
Node cur = dummyHead.next;
while (cur != null) {
res.append(cur.e + "=>");
cur = cur.next;
}
res.append("NULL");
return res.toString();
}
}
下邊我們來簡單看一下源碼程拭,簡單的方法我們就不介紹了定踱,主要是看add,remove恃鞋。像set其實就是遍歷一下鏈表崖媚,把對應的值設(shè)置給對應的key。get也是一樣恤浪,遍歷一下鏈表畅哑,獲取到對應key的value。contain也是遍歷水由,如果查到對應的key就返回true荠呐,如果差不多就返回false。
- add方法
add方法就是在鏈表的末尾添加一個元素,這里也很簡單泥张,遍歷到最后一個然后創(chuàng)建一個新的節(jié)點呵恢。 - remove方法
remove方法就是移動到要刪除的節(jié)點那,然后刪除節(jié)點的前一個節(jié)點只想刪除節(jié)點的下一個節(jié)點媚创,然后把刪除節(jié)點指向空渗钉。然后size減一。這樣刪除操作就完成了钞钙。
其實鏈表的操作思想很簡單鳄橘,主要是代碼實現(xiàn)比較費勁。如果要學習鏈表的話可以自己多做練習芒炼,下次我會給兩個鏈表的題瘫怜,并且解釋一下鏈表的實現(xiàn)。