牛客網刷題之連結串列中倒數第k個結點
阿新 • • 發佈:2019-01-03
題目描述:
解題思路:
強解法:先遍歷連結串列得出所有節點的個數n,再遍歷一次得到n-k+1節點就是所得到的結果,這一共遍歷了兩次,這基本是不能通過測試的,當然也不會是我們想要的;
看到倒數兩個字有沒有想到棧的先進後出特點,那我們是不是可以先將連結串列中的節點取出來push進棧中,然後取pop出k個節點,那麼第k個節點就是所要求的?答案是可以的!!!
public ListNode FindKthToTail(ListNode head,int k) {
ListNode result = null;
if(head == null || k <= 0 ){
return null;
}
Stack<ListNode> s = new Stack<>();
while(head != null){
s.push(head);
head = head.next;
}
for(int i = 0 ; i < k ; i ++){
if(!s.isEmpty()){
result = s.pop();
}else {
result = null;
}
}
return result;
}
測試結果:
其實,我們要做的就是要減少遍歷次數從而對程式進行優化,可以定義兩個指標,同時指向頭節點,先讓第一個指標走k-1步,然後第二個指標才開始往後移動,當第一個指標到達連結串列終點,那麼第二個指標剛好走了k-1步,也就是倒數第k個節點。這就好比移尺子運算,兩個指標始終相差k-1個節點。
題解:
public ListNode FindKthToTail(ListNode head,int k) {
ListNode first = head;
ListNode sec = head;
if (head == null || k <= 0){
return null;
}
for(int i = 0 ; i < k-1 ; i ++){
if(first.next != null){
first = first.next;
}else{
return null;
}
}
while(first.next != null){
first = first.next;
sec = sec.next;
}
return sec;
}