單鏈表面試題(百度 騰訊 )

2021-10-05 08:21:54 字數 3592 閱讀 9560

目錄

學習了單鏈表的應用(面試題)

1. 求單鏈表的有效節點

- 思路:

- **:

- 思路

- **:

- 備註:

- 思路:

- **:

- 備註:

- 思路:

- **:

- 備註:

5. 合併兩個有序單鏈表,合併之後,依然有序

- 思路:

- **:

- 備註:

1、新增輔助變數num,用於記錄單鏈表有效節點的個數,新增curnode指標,用於遍歷單鏈表的所有節點

2、num在遍歷單鏈表的所有節點過程中,自增

3、得出的num即為單鏈表的有效節點

//獲的鍊錶的長度

public static int getlength(heronode headnode)

heronode curheronode = headnode.next;

int num = 0;

while(curheronode!=null)

return num;

}

1、遍歷單鏈表,算出來單鏈表的長度,記為length

2、從頭再次遍歷單單鍊錶,遍歷到第(length - k)個節點時停止,即為倒數第k個節點。

//獲的倒數第k個節點

private static heronode getlastindexnode(heronode headnode, int k)

int size = getlength(headnode);

//校驗k是否合理

if(k < 0||k > size)

heronode curheronode = headnode.next;

for (int i = 0; i <(size-k) ; i++)

// todo auto-generated method stub

return curheronode;

}

1、別忘了校驗下k的合理性
1、新新增個頭節點,用於盛放翻轉後的單鏈表

reverseheadnode = new heronode();

2、新建立curnode和nextnode指標,用於指向原鍊錶的節點,用curnode指標遍歷單鏈表,每次遍歷的節點,全部插入到reverseheadnode頭節點的後面

3、遍歷完成後,將headnode頭節點指向reverseheadnode.next.

//翻轉單鏈表

private static void reverselinklist(heronode headnode)

//定義輔助指標,用來遍歷單鏈表

heronode curnode = headnode.next;

heronode nextnode = null;

//定義個新頭節點,用於盛放翻轉後的單鏈表

heronode reverseheadnode = new heronode(0, "", "");

while(curnode != null)

headnode.next = reverseheadnode.next;

}

1、nextnode指標是必須有的,因為他記錄著遍歷時下個節點的位置資訊(將curnode節點插入到reverseheadnode節點後,這個節點已經被摘除了,此時只能靠著nextnode節點來繼續遍歷下個節點)
1、可以先翻轉,再列印,但是這樣就破壞了原鍊錶的結構(不提倡)

2、可以應用棧,遍歷單鏈表時,將每個單鏈表壓棧,遍歷完成後,再出棧,此時出棧的順序就是從未到頭列印單鏈表的順序

//單鏈表翻轉列印

private static void reverseprint(heronode headnode)

stackstack = new stack();

heronode curnode = headnode.next;

while(curnode != null)

while(stack.size()>0)

}

應用棧的先入後出的原理,倒序列印單鏈表節點資訊
1、思路一:新建個單鏈表c,比較前兩個單鏈表的每個節點,節點小的放c尾部

2、思路二:已其中乙個單鏈表為基準a,讓另乙個單鏈表插入a中

思路一的**:

private static singlelinklist togethertoverse(heronode headnode1, heronode headnode2) 

if (headnode2.next == null)

//都不為空的話,同時遍歷兩個鍊錶,每次比較兩個鍊錶的節點,取出最小的元素,排在singlelinklist後面

heronode curnode1 = headnode1.next;

heronode nextnode1 = null;

heronode curnode2 = headnode2.next;

heronode nextnode2 = null;

heronode curnode3 = headnode3;

while (true)

if (curnode1.getno() <= curnode2.getno()) else

} if (curnode1 == null && curnode2 != null)

if (curnode1 != null && curnode2 == null)

return singlelinklist;

}

思路二**:

private static void togethertoverse1(heronode headnode1,heronode headnode2) 

if(headnode2.next == null)

heronode curnode1 = headnode1.next;

heronode prenode1 = headnode1;

heronode curnode2 = headnode2.next;

heronode nextnode2 = null;

while(true)

if(curnode1.getno() < curnode2.getno()) else

} if(curnode1 == null && curnode2 != null)

}

1、這個**弄得我蛋疼,切記,同乙個節點,千萬不能既讓單鏈表一新增,又讓鍊錶二新增,否則,鍊錶二的會覆蓋鍊錶一的;

2、當遇到遍歷插入的運算是,一定要想到nextnode指標,且不能直接寫node = node.next;

單鏈表 (面試題)

關於單鏈表的基本操作,之前已經總結過了,那些掌握之後算是了解了單鏈表是什麼?不過現在面試的題中,肯定不會只讓你回答單鏈表的基礎操作,總是會改變一些東西,或是擴充套件一下。下面就是一些關於單鏈表的擴充套件內容 include include include pragma warning disable...

單鏈表面試題

1.倒序列印鍊錶 void reverseprint slistnode pfirst 有兩種方法 1.遞迴操作 2.非遞迴操作 2 非遞迴 slistnode pend slistnode pcur pend null while pfirst pend pend pcur printf d pe...

單鏈表(面試題)

鍊錶反轉思路 1.單鏈表中有效節點的個數 2.查詢單鏈表中弟第k個節點 3.單鏈表的反轉 實現 如下 public class testlink 1單鏈表中有效節點的個數 遍歷得出個數 public static intcount heronode head int count 0 while tr...