順序表和煉表的基本操作(Java實現)

2021-09-19 03:29:35 字數 4389 閱讀 4747

線性表

頭插/尾插/中間插入 頭刪/尾刪

1.順序表

想細節,寫偽**。

難點:迴圈邊界

2.鍊錶(*****)

結點和結點之間的邏輯關係

邏輯上有前後關係,物理儲存也是前後相連的。

頭插

思考:(偽**)

1.需要後移size個元素

2.為避免資料被覆蓋,從後往前移

3.空間[size,1]  資料[size-1,0]

4.array[空間的下標]=array[資料的下標]

5.空間的下標=資料的下標+1

插入:(在下標為index的位置上插入item)

思考:(偽**)

1.需要後移size-index個元素

2.為避免資料被覆蓋,從後往前移

3.空間[size,index+1]  資料[size-1,index]

4.array[空間的下標]=array[資料的下標]

5.空間的下標=資料的下標+1

在插入和頭插的時候,要注意從後往前插。

尾插:直接插入

頭刪

1.需要移動size-1個資料

2.為避免資料覆蓋,從前往後移。

3.空間[0,size-1],資料[1,size]

4.array[空間的下標]=array[資料的下標]

5.空間的下標=資料的下標+1

刪除:下標是index的資料

1.需要移動size-index-1個資料

2.為避免資料覆蓋,從前往後移。

3.空間[index,size-2],資料[1+index,size-1]

4.array[空間的下標]=array[資料的下標]

5.空間的下標=資料的下標+1

尾插/尾刪		o(1) 均攤o(1),在擴容時是o(n)

頭插/頭刪 o(n) 資料搬移是耗時的

中間插入/刪除 o(n) 資料搬移是耗時的

查詢的時間複雜度 o(1)直接通過下標

假如我們的陣列放不下了,擴容

this.array  住的老房子

this.size    房子裡住的人

應該搬家    this.size==this.array.length

1)先找新房子

2)搬家

3)this.array=新房子的位址

4)退掉老房子

package com.company.datastruct.list.arraylist;

public inte***ce iarraylist

package com.company.datastruct.list.arraylist;

public class myarraylist implements iarraylist

public int getsize()

public void setsize(int size)

/*** 返回下標是index的資料

* @param index

* @return

*/public int getindex(int index)

@override

//頭插 t(n)=o(n)

public void pushfront(int item)

this.array[0]=item;

this.size++;

}@override

public void pushback(int item) else

}@override

public void add(int item, int index)

if(index<0||index>this.size)

//index=0時是最壞情況,

// i代表資料的下標

for(int i=this.size-1;i>=index;i--)

// i代表迴圈的次數

// for(int i=0;i=this.size)

if(this.size==0)

for(int i=index;i=this.size)

return this.array[pos];

}@override

public void display()

鍊錶類  第乙個結點的引用

引用,如:

@0xff

@0xcc

@0x33

@0x99

@0xaa

分析下面的每句**代表什麼意思?

node p1=//@0xff

node p2=//@0xaa

node p3=//0x@cc

p1.next=p2; <=>@0xff

p2=p1.next; <=> p2=//@0xcc;

p1.next.next=p2;<=> @0xcc

p1.next.next=p3.next.next;<=> @0xcc

p1=p2;<=>p1=@0xaa

頭插

1)先建立乙個結點

2)設定結點的下乙個結點是原來的頭結點

3)修改原來鍊錶的頭結點為新結點

頭刪

1)首先判斷鍊錶是否為空

2)如果鍊錶為空,丟擲異常

3)如果鍊錶不為空,則修改原來的頭結點為原頭結點的下乙個結點

尾插

1)先建立乙個結點

2)如果鍊錶為空,則將該結點賦值給鍊錶的頭結點。

3)否則獲取到鍊錶的最後乙個結點,修改最後乙個結點的next為新結點。

尾刪

1)先判斷鍊錶是否為空。

2)如果為空,則直接丟擲異常。

3)如果不為空,尋找鍊錶的倒數第二個結點,修改該結點的next為null。

4)如果鍊錶只有乙個結點,則將鍊錶的頭結點設定為null。

package com.company.datastruct.list.linkedlist;

public class mylinkedlist

}// 如果乙個結點都沒有,head=null

private node head;//儲存鍊錶中第乙個結點的引用

public node gethead()

mylinkedlist()

/*** 頭插 將item值的結點插入到鍊錶的最前面

* @param item

*/public void pushfront(int item)

/*** 獲取鍊錶的最後乙個結點

* @return

*/private node getlast()

return cur;

}/**

* 尾插

* @param item

*/public void pushback(int item)else

}/**

* 頭刪 t(n)=o(1)

*/public void popfront()

this.head=this.head.next;

}/**

* 查詢倒數第二個結點

* @return

*/private node getsecondlast()

return pnode;

}/**

* 尾刪

*/public void popback()

if(this.head.next==null)

node pnode=getsecondlast();

//此時pnode是倒數第二個結點

pnode.next=null;

}/**

* 如何通過迴圈,遍歷鍊錶的每個結點

*/void display()

system.out.println("null");}}

測試**:

package com.company.datastruct.list.linkedlist;

public class testlinkedlist

}

結果:

順序表和煉表基本操作

1.列印 public void display result system.out.println result 2.插入元素 public void add int pos,int data 容量不夠就擴容 if size datas.length datas newdatas 在尾部插入 if...

順序鍊錶的基本操作

標頭檔案 ifndef commonheader h define commonheader h include include include include include include include include include include include include inclu...

Java鍊錶(基本操作)

鍊錶是一種最為簡單的資料結構,它的主要目的是依靠引用關係來實現多個資料的儲存,下面 以string字串型別示例 class node public void setnext node next public node getnext public string getdata public clas...