定義鍊錶的內部節點
public
class
node
最後乙個節點的next儲存的為空,喪失了隨機訪問的能力,適應索引沒有語義的情況。鍊錶的新增元素
鍊錶的增加節點(不帶頭節點)
public
class
linklist
//鍊錶首部新增元素,這時候是簡單的
public
void
addfrist
(e e)
//鍊錶的中間新增元素
public
void
add(
int index, e e)
node pre = head;
if(index ==0)
//找到插入的位置
for(
int i =
1; i < index; i++
)//然後進行新增
node node =
newnode
(e);
node.next = pre.next;
pre.next = node;
size++;}
//末尾新增元素
public
void
addlast
(e e)
@override
public string tostring()
return builder.
tostring();}}
對鍊錶的改善,增加虛擬頭節點//儲存鍊錶的頭節點
private node dummyhead;
public
linklist()
注意此時對tostring的迴圈中需要換成temp.next
。此時不需要對頭節點進行額外處理了,addfrist還可以復用add方法。
返回鍊錶中指定索引的元素
//返回鍊錶的指定索引的元素
public e get
(int index)
node cur = dummyhead.next;
for(
int i =
0; i < index; i++
)return cur.e;
}
查詢某個元素
//查詢某個元素是否存在
public
boolean
contain
(e e)
}return
false
;}
刪除指定索引元素
//刪除指定索引
public e delete
(int index)
node pre = dummyhead.next;
for(
int i =
0; i < index; i++
) node deletenode = pre.next;
pre.next = deletenode.next;
deletenode.next = null;
return deletenode.e;
size--
;}
鍊錶對頭的操作是o(1),其他操作都是o(n)用鍊錶實現棧和佇列
思路和陣列差不多,實現棧的話,在頭部增加和取出,實現棧。佇列的話可以使用在隊首進行出列,隊尾進行入列,head,tail。 因為在隊首刪除元素比較容易,在隊尾進行刪除不容易。
鍊錶的入隊和出隊。
@override
public e dequeue()
入隊 @override
public
void
enqueue
(e e)
else
size ++
;}
鍊錶的天然遞迴結構特性
鍊錶可以堪稱該節點和其他節點的遞迴。
leetcode中的乙個演算法題
刪除鍊錶中等於給定值 val 的所有節點。
示例:輸入: 1->2->6->3->4->5->6, val = 6
輸出: 1->2->3->4->5
/**
* definition for singly-linked list.
* public class listnode
* }*/class
solution
head.next =
removeelements
(head.next,val);if
(head.val == val)
else
}}
優點就是簡潔,但是占用的記憶體較大。 資料結構 表之煉表
頭插法建立 尾插法建立 顯示 銷毀 include include using namespace std typedef int elemtype typedef struct lnode linklist void createlinklistf linklist l,elemtype a,in...
資料結構之鍊錶
頭結點 第乙個有效結點之前的那個結點 頭結點並不存有效資料 加頭結點的目的主要是為了方便對鍊錶的操作 頭指標 指向頭結點的指標變數 尾指標 指向尾節點的指標變數 如果希望通過乙個函式對鍊錶進行處理,只需要乙個引數 頭指標 首先要定義乙個單鏈表儲存結構 然後建立乙個空表,即初始化,我寫的這個提前設定好...
資料結構之鍊錶
鍊錶是一種基本的資料結構型別,它由乙個個結點組成。每乙個結點包括乙個資料的儲存和乙個指向下乙個結點的引用。在這個定義中,結點是乙個可能含有任意型別資料的抽象實體,它所包含的指向結點的應用顯示了它在構造鍊錶之中的作用。和遞迴程式一樣,遞迴資料結構的概念一開始也令人費解,但其實它的簡潔性賦予了它巨大的價...