目錄
學習了單鏈表的應用(面試題)
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...