思路:建立三個工作指標p, q, r,然後p遍歷整個鍊錶,p每到乙個結點,q就從這個結點往後遍歷,並與p的數值比較,相同的話就free掉那個結點.
**:
// 刪除單鏈表中重複結點的演算法
linklist removedupnode(linklist l)
else
q = q->next;
}p = p->next;
}return l;
}
思路:建立兩個指標,第乙個指標先走n步,然後第二個指標也開始走,兩個指標前進速度一致,當第乙個指標到達鍊錶末尾時, 第二個指標的位置就是我們需要的倒數第n個結點的值.
**:
// 獲取單鏈表倒數第n個結點的值
int getnthnodefromback(linklist l, int n, elemtype* e)
if (null
== firstnode->next)
linklist secondnode = l;
while(firstnode !=
null)
*e = secondenode->
data;
return ok;
}
思路:和上面的查詢倒數第n個結點類似,設定兩個指標search, mid都指向單鏈表的頭結點,其中search的移動速度是mid的兩倍,當search指向末尾的時候,mid正好指向中間結點.
**:
// 查詢中間結點
int getmidnode(linklist l, elemtype* e)
else
// 只有奇數個結點
}*e = mid->
data;
retur ok;
}
思路:設定兩個指標,乙個走快點,乙個走慢點,若有環的話,則必然會在某個結點相遇.
**:
int linklisthashoop(linklist l)
// 相遇
if (q == p)
return
1; }
return
0;}
思路:還是設定兩個指標p, q. p總是往前走, q每次都是從頭開始走,對於每個結點,看看它們的步數是否相同。如:p從a走到d用了四步, 而q用了十四步,則必然存在環.
**:
int linklisthashoop(linklist l)
else
// 有環
}cur2 = cur2->next;
}cur1 = cur1->next;
}return
0;}
思路:分為兩種情況:第一種情況如果兩個鍊錶都沒有環的話,那麼兩個鍊錶要是相交,那麼它們從相交的那個結點開始到尾結點兩個鍊錶應該完全相同。這樣,有個簡單的方法直接判斷兩個鍊錶的尾結點是否相同來判斷兩個鍊錶是否相交。
第二種情況:如果兩個鍊錶存在環的話,那麼就判斷一煉表上兩指標相遇的那個結點,在不在另乙個鍊錶上,若在,則相交;若不在,則不相交.
**:
bool detect(node *head1, node *head2)
else
//如果連鍊錶都存在環的話要看相交節點是不是在兩鍊錶都出現
return
false;
}return
false;
}
關於單鏈表的演算法題
1.順序表和煉表的優缺點。順序表的優點是可以隨機訪問資料元素 缺點是大小固定,不利於增刪結點。鍊錶的優點是採用指標方式增減結點,非常方便 只需要改變指標指向,不移動結點 缺點是不能進行隨機訪問,另外,每個結點上增加指標域,造成額外儲存空間增大。include include include incl...
關於單鏈表
單鏈表結構體 typedef struct student node 建立單鏈表 node create else p head while cycle else head head next p next null printf n yyy d head data return head 單鏈表測...
關於單鏈表的逆序
昨天的課後習題出現了乙個單鏈表的逆序問題,作為乙個志在成為程式媛的我,寫了我人生中的第一篇部落格。題目要求是 逆轉鍊錶,並返回逆轉後的頭結點。我們先考慮一下對於鍊錶逆序時可能會出現的情況 對於乙個空鍊錶 很明顯沒有資料,沒有內容,不需要逆序,之前return 對於只有乙個節點的鍊錶我們也是不需要考慮...