刪除單鏈表中重複的值(Java版),單鏈java
題目:刪除帶頭結點的單鏈表中重複值的元素(即讓每種值的元素只有一個)
解題思路:
用一個動態輔助儲存數組,每次要向輔助數組中放入元素時,讓輔助數組的長度加1,最長時與單鏈表一樣長,設一個指標p,讓它指向頭結點,從單鏈表中第一個元素開始,將它的值放入輔助數組中,然後依次訪問單鏈表後面的元素,用該元素的值與數組中所有已經被賦值的元素的值進行比較,如果不等於數組中任何元素的值,那麼讓p的next指向該結點的next指標,刪除該結點元素,否則令p指向p的next指標,並將當前訪問的節點元素的值依次放入輔助數組,一直訪問到單鏈表中的最後一個元素。
ADT定義:
//單鏈表的結點類class LNode{//為了簡化訪問單鏈表,結點中的資料項目的存取權限都設為publicpublic int data;public LNode next;}
演算法實現:
public class LinkListUtli {public static void deleteRepeatValue(LNode L){//如果單鏈表為空白,或者只有頭結點,或者頭結點後面只有一個元素時,不可能存在值重複的元素if(L==null||L.next==null||L.next.next==null) return;LNode p=L;//當前訪問結點的前一個結點LNode q=L.next;//當前訪問的結點int count=0;while(q!=null){count++;}int temp[]=new int[count];count=1;temp[count-1]=q.data;while(q.next!=null)//一直往下訪問,直到訪問單鏈表中的最後一個結點{q=q.next;//訪問下一個結點boolean flag=false;//用來標記當前訪問結點元素中的值是否與之前訪問結點元素的值相同for(int i=0;i<count;i++){if(q.data==temp[i]){p.next=q.next;flag=true;break;}}if(!flag){count++;temp[count-1]=q.data;q=q.next;//讓q往下走一步,保證p是下個訪問結點的前一個結點}}q=null;//此時q可能是已經釋放了的指標,如果不令它指向null,它會變成野指標}}