題目分析:
移除的方法是把要移除節(jié)點(diǎn)的前節(jié)點(diǎn)的后繼 指向 要移除節(jié)點(diǎn)的后繼。
那就需要兩個(gè)指針來(lái)保存兩個(gè)節(jié)點(diǎn)的位置。
判斷重復(fù)值,需要當(dāng)前節(jié)點(diǎn)跟當(dāng)前節(jié)點(diǎn)的后繼來(lái)比較。
構(gòu)造各種用例完善程序結(jié)構(gòu)几苍。
比如:
頭兩個(gè)節(jié)點(diǎn)相同。
最后兩個(gè)節(jié)點(diǎn)相同陈哑。
中間兩件兩個(gè)節(jié)點(diǎn)相同擦剑。
分析這些用例,結(jié)合題目的要求芥颈,獲知
1.運(yùn)動(dòng)到 快指針和快指針的后繼值不同
2.運(yùn)動(dòng)到 快指針和快指針的后繼值相同 直到獲取不同的后繼值
3.獲取到不同的后繼值 之后的運(yùn)算
這三者運(yùn)算邏輯都不一樣惠勒。
var linkList = {
val: 1,
next: {
val: 1,
next: {
val: 0,
next: {
val: 2,
next: {
val: 2,
next: {
val: 5,
next: {
val: 6,
next: {
val: 6
}
}
}
}
}
}
},
};
/*
運(yùn)動(dòng)的生成原則:
以空間的可復(fù)用性和運(yùn)動(dòng)的可復(fù)用性出發(fā),
如果一個(gè)空間的復(fù)用滿足不了爬坑,再申請(qǐng)一個(gè)空間纠屋。
如果一個(gè)運(yùn)動(dòng)的復(fù)用滿足不了,再申請(qǐng)一個(gè)運(yùn)動(dòng)盾计。
為什么要這樣的運(yùn)功方式售担,這樣的用例赁遗?
自己的解題經(jīng)驗(yàn)和直覺(jué)。以及鏈表的本質(zhì)族铆。
邊界條件:鏈表頭部節(jié)點(diǎn)為空或者只有一個(gè)節(jié)點(diǎn)岩四。
初始空間:慢指針,快指針哥攘,快指針的后繼剖煌。
初始狀態(tài):慢指針為undefined,快指針指向第一個(gè)節(jié)點(diǎn)逝淹,
主運(yùn)動(dòng)循環(huán)邏輯:
0. 快指針未走完鏈表耕姊。
1. 快指針跟快指針的后繼值不同,慢指針走向快指針栅葡,快指針往前走一步茉兰。
2. 快指針跟快指針的n后繼值相同,快指的后繼針往前走一步欣簇。
3. 頭部判斷规脸;是頭部頭節(jié)點(diǎn)指向快指針的后繼;非頭部慢指針指向快指針的后繼熊咽。
4. 快指針往前走一步莫鸭。
*/
var deleteDuplicates = function (head) {
if (head === undefined || head.next === undefined) {
return head;
}
var slow = head;
var fast = head;
// 遍歷所有節(jié)點(diǎn)
while (fast) {
// 快指針的后繼
var _next = fast.next;
// 鏈表末尾判斷
if (_next === undefined) {
return head;
}
// --- 快指針跟快指針的后繼值不同,則慢指針走向快指針网棍,快指針往前走一步 ---
if (fast.val !== _next.val) {
slow = fast;
fast = _next;
continue;
}
// ---
// --- 快指針跟快指針的后繼值相同黔龟,快指針的后繼往前走一步 ---
while (_next !== undefined && _next.val == fast.val) {
_next = _next.next;
}
// 快指針跟快指針的后繼值不同
// 鏈表頭部重復(fù)妇智,更新鏈表頭部
if (fast === head) {
head = _next;
}
else {
// 非鏈表頭部重復(fù)滥玷,即鏈表中間或鏈表結(jié)尾
slow.next = _next
}
// 繼續(xù)遍歷
fast = _next;
// ---
}
return head;
}
var result = deleteDuplicates(linkList);
console.log(result);
尷尬的更新20180726
const linkList = {
val: 1,
next: {
val: 1,
next: {
val: 0,
next: {
val: 2,
next: {
val: 2,
next: {
val: 5,
next: {
val: 6,
next: {
val: 6
}
}
}
}
}
}
},
};
const DeleteSameElem = function(List){
let pre = List;
let next = List.next;
while(next !== undefined ){
if(pre.val === next.val){
pre.next = next.next;
next = next.next;
}
else{
next = next.next;
pre = pre.next;
}
}
return List
}
const result = DeleteSameElem(linkList);
console.log(result);