多種單鏈表反轉面試題總結

2021-08-01 02:35:00 字數 3538 閱讀 7609

總結下面試題中常見的單鏈表反**

**如下:

/*

* 翻轉鍊錶(遍歷)

* 從頭到尾遍歷原鍊錶,每遍歷乙個結點,

* 將其摘下放在新鍊錶的最前端。

* 注意鍊錶為空和只有乙個結點的情況。時間複雜度為o(n)

*/public static listnode reversenode(listnode head)

return rehead;

}

/**

* 分組反轉單鏈表,最後不足k個節點的部分也反轉

* @param head

* @param k

* @return

*/public static listnode reversekgroup(listnode head, int k)

/** cur is now a pointer to (k+1)th node recursively call for the

* list starting from current. and make rest of the list as next of

* first node

*/if (cur != null)

head.next = reversekgroup(cur, k);

return rehead;

}

舉例解釋:

輸入的原始單鏈表為3-5-6-9-7-2-1-12,其中k為3;

經過第一次while迴圈,單鏈表變為6-5-3-9-7-2-1-12。此時跳出while迴圈是因為count經過第二次while迴圈,單鏈表為6-5-3-2-7-9-1-12。此時跳出while迴圈是因為count第三次迴圈,跳出while是因為cur==null了,直接返回rehead,此時rehead指向了12。

可以看出,k個為一組反轉單鏈表,核心**還是常規的如何反轉單鏈表。

這是一道leetcode原題:

思路:核心**還是反轉常規的單鏈表,不過此題需要加上節點數量的判斷,當節點數目不足k個時,不進行反轉操作,直接返回。

/**

* 分組反轉單鏈表,最後不足k個節點的部分不反轉

* @param head

* @param k

* @return

*/public static listnode reversekgroups(listnode head, int k)

/** cur is now a pointer to (k+1)th node recursively call for the

* list starting from current. and make rest of the list as next of

* first node

*/if (cur != null)

head.next = reversekgroups(cur, k);

return rehead;

} return cur;

}

統計節點數目函式如下:

/**

* 統計該節點之後的節點數量

* @param head

* @return

*/public static int getsize(listnode head)

return count;

}

ac結果如下:

總結:

各個形式的反轉單鏈表,最重要的理清楚head、rehead和cur三個節點的關係,通過核心**和方法的遞迴來實現分組反轉。

附上完整**:

public class main 

// 列印鍊錶的方法,方便test函式

public static void printlist(listnode head)

system.out.println();

} /**

* 分組反轉單鏈表,最後不足k個節點的部分不反轉

* @param head

* @param k

* @return

*/public static listnode reversekgroups(listnode head, int k)

/** cur is now a pointer to (k+1)th node recursively call for the

* list starting from current. and make rest of the list as next of

* first node

*/if (cur != null)

head.next = reversekgroups(cur, k);

return rehead;

} return cur;

} /**

* 分組反轉單鏈表,最後不足k個節點的部分也反轉

* @param head

* @param k

* @return

*/public static listnode reversekgroup(listnode head, int k)

/** cur is now a pointer to (k+1)th node recursively call for the

* list starting from current. and make rest of the list as next of

* first node

*/if (cur != null)

head.next = reversekgroup(cur, k);

return rehead;

} /**

* 統計該節點之後的節點數量

* @param head

* @return

*/public static int getsize(listnode head)

return count; }

/* * 翻轉鍊錶(遍歷) 從頭到尾遍歷原鍊錶,每遍歷乙個結點, 將其摘下放在新鍊錶的最前端。 注意鍊錶為空和只有乙個結點的情況。時間複雜度為o(n)

*/public static listnode reversenode(listnode head)

return rehead; }}

class listnode

}

面試題 單鏈表反轉

問題 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。一 非遞迴演算法 假設有鍊錶a b c d e f g。在反轉鍊錶過程中的某一階段,其鍊錶指標指向為 a b c d e f g。也就是說在結點d之前的所有結點都已經反轉,而結點d後面的結點e開始的所有結點都沒有反轉。這樣...

鏈表面試題 反轉單鏈表

反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null解決方案 頭插法開闢新鍊錶並逐個讀取舊鍊錶,頭插進新鍊錶,這樣新的鍊錶與原鍊錶的結構就是反的,需要借助輔助空間 definition for singly linked list.struct listnod...

開心IT面試題 單鏈表排序 反轉

一 單鏈表排序 仿照基於陣列的氣泡排序演算法 node sorting linklist node node node result int temp 0 int len length linklist node result node for int j 0 j len j result resu...