常考煉錶筆試題(一)

2021-09-22 01:33:22 字數 3319 閱讀 1557

1、刪除鍊錶中等於給定值 val 的所有節點。

示例:

輸入: 1->2->6->3->4->5->6, val = 6

輸出: 1->2->3->4->5

思路:

要刪除鍊錶中等於給定值的所有節點,我們可以定義乙個結果鍊錶,再結合尾插的方法來實現。

定義乙個last引用,指向結果鍊錶的最後乙個節點,cur引用指向給定鍊錶的第乙個節點。遍歷鍊錶,如果節點的值與給定值val不相等,就把它尾插到結果鍊錶。尾插的時候要考慮到兩種情況,結果鍊錶為空和不為空,這個在之前鍊錶的那篇部落格裡我有說過,這裡就不再羅嗦,需要注意的是,插入乙個新節點後要記得更新結果鍊錶的最後乙個節點,即last引用的指向。

//定義乙個節點(後邊所有問題都會用到!)

public

static

class

listnode

}

//刪除煉表裡所有值為val的結點

public listnode removeelements

(listnode head,

int val)

else

//更新結果鍊錶的最後乙個結點

last = cur;

} cur = next;

}return result;

}

其實還有一種方法可以實現,我們直接在給定的鍊錶上修改。依然是遍歷整個鍊錶,定義乙個cur引用指向鍊錶的第乙個節點,如果當前節點的next引用儲存的值,即下乙個節點的值與給定值相等,我們就可以把當前節點的next引用指向它的下下乙個節點,也就是next.next,如果不相等的話,指向下乙個節點就可以了。

可是這樣寫的話會有乙個問題,我們並沒有判斷第乙個節點的值是否與指定值相等,其實很簡單,我們可以再加乙個判斷,如果相等,返回頭節點的下乙個節點,不相等的話就返回頭節點。

public listnode removeelements2

(listnode head,

int val)

listnode cur = head;

while

(cur.next!=null)

else}if

(head.val==val)

else

}

2、反轉乙個單鏈表。示例:輸入: 1->2->3->4->5->null

輸出: 5->4->3->2->1->null

思路:

反轉乙個單鏈表依然可以借助定義乙個結果鍊錶和頭插的方法來實現。

定義乙個cur引用指向當前鍊錶的頭節點。遍歷鍊錶,取出乙個節點,頭插到結果鍊錶中,鍊錶的頭插這裡就不多說了,直接看**。

//反轉鍊錶

public listnode reverselist

(listnode head)

return result;

}

還有一種方法也可以實現鍊錶的反轉。

利用三引用遍歷的方法,就是再定義乙個節點prev來儲存當前節點的前驅,有了這個前驅結點,要逆置鍊錶我們只需要將cur的引用指向prev就行,也就是圖中橙色箭頭部分。

這樣操作之後,原來的鍊錶就變成了下面這樣:

然而很明顯出現了乙個問題,原來cur指向的d節點就找不到了,怎麼辦呢,我們可以再定義乙個next節點來儲存d節點,這就是三引用遍歷的方法。

最後,三個引用依次往後走,就實現了鍊錶的反轉,如下圖:

但是需要考慮乙個問題,如果cur指向的是第乙個節點,那麼它的前驅就應該是空。

**如下:

public listnode reverselist2

(listnode head)

listnode prev = null;

listnode cur = head;

while

(cur!=null)

return prev;

}

3、合併兩條鍊錶示例:輸入:1->2->4, 1->3->4

輸出:1->1->2->3->4->4

思路:

找兩個引用cur1,cur2分別指向原來兩條鍊錶的第乙個節點,定義乙個結果鍊錶result,再用乙個last引用記錄結果鍊錶的最後乙個節點。

當cur1和cur2都不為空的時候,遍歷原來的兩條鍊錶,比較cur1和cur2的值,哪個小就把它尾插到結果鍊錶中。尾插這裡不用多講,注意鍊錶為空和不為空兩種情況。

一旦cur1或者cur2中有乙個變為null,就意味著有一條鍊錶遍歷結束,那麼直接將另一條鍊錶中的剩餘資料插入到結果鍊錶中即可。

考慮一種特殊情況,就是如果傳進來的兩條鍊錶其中一條為空,那麼結果鍊錶直接返回另一條鍊錶即可。

**如下:

public listnode mergetwolists

(listnode l1, listnode l2)

if(l2==null)

listnode cur1 = l1;

listnode cur2 = l2;

listnode result = null;

//結果鍊錶的第乙個結點

listnode last = null;

//記錄最後乙個結點

while

(cur1!=null && cur2!=null)

else

last = cur1;

cur1 = next;

}else

else

last = cur2;

cur2 = next;}}

if(cur1!=null)

if(cur2!=null)

return result;

}

常考煉錶筆試題(三)

1 判斷是否是回文 思路 判斷乙個鍊錶是否是回文結構,我們可以先找到這個鍊錶的中間節點middle,然後將middle節點之後的鍊錶進行反轉,得到乙個新鍊錶。再定義兩個引用,分別指向原煉表和新鍊錶的第乙個節點,然後遍歷鍊錶,從第乙個結點開始比較,如果兩個引用的值不一樣,那麼就不是回文。過程如下 所以...

常考煉錶筆試題(四)

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