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...