常考煉錶筆試題(三)

2021-09-24 02:51:24 字數 2772 閱讀 7727

1、判斷是否是回文

思路:

判斷乙個鍊錶是否是回文結構,我們可以先找到這個鍊錶的中間節點middle,然後將middle節點之後的鍊錶進行反轉,得到乙個新鍊錶。

再定義兩個引用,分別指向原煉表和新鍊錶的第乙個節點,然後遍歷鍊錶,從第乙個結點開始比較,如果兩個引用的值不一樣,那麼就不是回文。

**過程如下:

所以我們現在要解決兩個問題:

1)找到鍊錶的中間結點

這個很簡單,遍歷鍊錶,求出它的長度,然後用乙個for迴圈[0,len/2]來找中間結點。

2)反轉鍊錶

之前也有介紹過,就是從原鍊錶拿下乙個節點,然後頭插到新鍊錶中。

具體**如下:

public

intlength

(listnode head)

return len;

}public listnode reverse

(listnode head)

return result;

}public

boolean

chkpalindrome

(listnode a)

listnode r =

reverse

(middle)

; listnode c1 = a;

listnode c2 = r;

while

(c1 != null && c2 != null)

c1 = c1.next;

c2 = c2.next;

}return

true

;}

2、在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。示例:鍊錶1->2->3->3->4->4->5,處理後為 1->2->5

思路:

定義兩個引用p1和p2分別指向鍊錶的第乙個和第二個節點,再定義乙個p1的前驅結點的引用prev,為了消除第乙個節點沒有前驅的特殊性,我們還需要定義乙個假結點dummy,如下圖:

然後從第乙個節點開始比較,如果p1和p2的值不相等,那麼prev,p1,p2三個引用依次往後移乙個,否則的話需要刪除p1和p2節點。

刪除的方法也很簡單,p2向後走乙個,讓prev的next引用直接指向p2節點,這就實現了刪除。接著讓p1引用也指向p2節點,如果p2節點不為空,就讓p2引用指向下乙個節點,然後重複上述步驟即可,第一次刪除後的鍊錶為下圖中紅色部分:

具體實現**如下:

public listnode deleteduplication

(listnode phead)

//消除第乙個結點沒有前驅的特殊性

listnode dummy =

newlistnode(0

);dummy.next = phead;

listnode prev = dummy;

//prev永遠是p1的前驅結點,用來刪除結點

//p1和p2是進行比較的兩個節點

listnode p1 = phead;

listnode p2 = phead.next;

while

(p2 != null)

else

//刪除結點

prev.next = p2;

p1 = p2;

if(p2 != null)}}

return dummy.next;

}

3、編寫乙個程式,找到兩個單鏈表相交的起始節點。示例:

思路:

求出兩條鍊錶的長度差,再定義兩個引用shorter和longer分別指向兩條鍊錶的頭節點,讓指向較長鍊錶的那個引用longer先走長度差步,相當於讓二者站在同一起跑線上。

當兩個引用的指向不同時,讓這兩個引用同時向後遍歷,注意,是比較這兩個引用,而不是比較它們的值,最後返回longer或shorter,這個就是兩條鍊錶最開始相交的節點。

具體**如下:

private

intgetlength

(listnode head)

return length;

}public listnode getintersectionnode

(listnode heada, listnode headb)

for(

int i =

0; i < diff; i++

)while

(longer != shorter)

return longer;

}

常考煉錶筆試題(一)

1 刪除鍊錶中等於給定值 val 的所有節點。示例 輸入 1 2 6 3 4 5 6,val 6 輸出 1 2 3 4 5 思路 要刪除鍊錶中等於給定值的所有節點,我們可以定義乙個結果鍊錶,再結合尾插的方法來實現。定義乙個last引用,指向結果鍊錶的最後乙個節點,cur引用指向給定鍊錶的第乙個節點。...

常考煉錶筆試題(四)

1 給定乙個鍊錶,判斷鍊錶中是否有環。示例 思路 這道題還是利用快慢引用的思路,快的走一步,如果不為空,快的再走一步,慢的走一步,如果快引用的指向為空,說明無環,而如果快引用和慢引用的指向相等,說明有環。具體 如下 public boolean hascycle listnode head list...

煉錶筆試題

反轉鍊錶 節點 class node object def init self,elem self.elem elem self.next none 鍊錶 class singlelist object def init self,head self.head head 反轉鍊錶 defrevers...