單鏈表的操作

2021-07-24 14:31:30 字數 3601 閱讀 4981

如下是我們對單鏈表節點的定義

public static class node  

}

這次採用的是從控制台進行輸入的方式來對鍊錶進行初始化

public static void main(string args)   

node temp=head;

while(in.hasnextint())

in.close();

(1)求煉表中結點的個數,注意while中是head

public static int getlistlength(node head)  

return len;

}

(2)將單鏈表翻轉,第一種是迴圈的方式,第二種是遞迴的方式

//將單鏈表反轉,迴圈  

public static node reverselist(node head)

return pre;

} //將單鏈表反轉,遞迴

public static node reverselistrec(node head)

(3)查詢鍊錶的倒數第k個結點

//查詢單鏈表中的倒數第k個結點(k > 0)  

public static node regetkthnode(node head,int k)

return target;

}

(5)從尾到頭對鍊錶進行列印

//從尾到頭列印單鏈表,遞迴  

public static void reverseprintlistrec(node head)

} //從尾到頭列印單鏈表,棧

public static void reverseprintliststack(node head)

while(!s.isempty())

}

(6)合併兩個有序鍊錶

//合併兩個有序的單鏈表head1和head2,迴圈  

public static node mergesortedlist(node head1,node head2)

else

target.next=null;

//建立乙個結點來儲存頭結點,一會兒好返回的時候用

node mergehead=target;

//下面才是真正比較結合了,是從target.next開始的

while(head1!=null && head2!=null)

else

target=target.next;

target.next=null;

}//如果乙個鍊錶是空,那麼另乙個鍊錶就不用弄了

if(head1==null)target.next=head2;

else target.next=head1;

return mergehead;

} //合併兩個有序的單鏈表head1和head2,遞迴

public static node mergesortedlistrec(node head1,node head2)

else

}

(7)對鍊錶進行排序

//對單鏈表進行排序,歸併排序,在排序裡面不建議選用遞迴的合併有序鍊錶演算法,如果鍊錶長度較長,很容易出現棧溢位  

public static node listsort(node head)

else

return mergesortedlist(listsort(head),listsort(nex));//合併兩個有序鍊錶,不建議遞迴

} //對單鏈表進行排序,插入排序

public node insertionsortlist(node head)

//如果temp的前乙個結點為空,那麼就將pnex結點變成head結點

if(temp_pre==null)

else

//向前移動

pnex=pnex_nex;

} return head;

}

(8)判斷乙個鍊錶是否有環

//判斷乙個單鏈表中是否有環,快慢指標  

public static boolean hascycle(node head)

} return flag;

}

(9)判斷兩個鍊錶是否相交

//判斷兩個單鏈表是否相交,如果相交返回第乙個節點,否則返回null  

//如果單純的判斷是否相交,只需要看最後乙個指標是否相等

public static node isintersect(node head1,node head2)

head=head.next;

} return target;

} //已知乙個單鏈表中存在環,求進入環中的第乙個節點,不用hashmap

//用快慢指標,與判斷乙個單鏈表中是否有環一樣,找到快慢指標第一次相交的節點,此時這個節點距離環開始節點的長度和鍊錶投距離環開始的節點的長度相等

public static node getfirstnodeincycle(node head)

if(fast==null||fast.next==null)return null;//判斷是否包含環

//相遇節點距離環開始節點的長度和鍊錶投距離環開始的節點的長度相等

slow=head;

while(slow!=fast)//同步走

return slow;

}

(11)o(1) 時間複雜度內刪除結點delete

//給出一單鏈表頭指標head和一節點指標delete,o(1)時間複雜度刪除節點delete  

//可惜採用將delete節點value值與它下個節點的值互換的方法,但是如果delete是最後乙個節點,則不行,但是總得複雜度還是o(1)

public static void deletenode(node head,node delete)

temp.next=null;

} }

else

return;

}

其中插入排序那塊有點難以理解,如下是乙個簡單的插入排序的操作的程式,幫助理解下插入排序

public static void insertsort(int array)   

for (int i = 1; i < array.length; i++) else

} array[position] = currentvalue;

} }

尊重原創,參考文章

單鏈表的操作

單鏈表是一種非常重要的資料結構,下面用c語言對單鏈表的操作做乙個簡單的總結 typedef struct nodenode,linklist 1 單鏈表的建立 建立乙個單鏈表,鍊錶裡面存放有十個偶數 2到20 有頭節點,頭節點不存放元素。linklist createlinklist return ...

單鏈表的操作

1.定義單鏈表的介面函式 ifndef linklist h define linklist h typedef int elemtype typedef struct node node node initnode bool addnode node head,elemtype data 頭插法 ...

單鏈表的操作

pragma once extern c list node,list link 頭插建立鍊錶 list link create list head int n 尾插法建立鍊錶 list link creat list tail int n 獲取長度 int get list length list...