設計乙個遞迴演算法,刪除不帶頭結點的單鏈表 l 的所有值 為 x的結點
終止條件:若l為空表,則返回。
遞迴主體:若 l->data == x,刪除此結點,繼續遞迴下乙個結點。
若 l->data != x ,遞迴下乙個結點。
演算法需要解除乙個遞迴工作棧,深度為 o(n),時間複雜度為 o(n)。
void
del_x
(linklist &l, elemtype x)
//遞迴實現在單鏈表l中刪除值為x的結點
在帶頭結點的單鏈表 l 中,刪除所有值為 x的結點,並且釋放其空間,假設值為 x 的結點不唯一,試編寫演算法實現上述操作。
用 p 結點從頭到尾掃瞄單鏈表,pre 指向 *p 結點的前驅。若 p 所指結點的值為 x,則刪除,並讓 p 移向下乙個結點,否則讓 pre、p 指標同步後移乙個結點。
void
del_x
(linklist &l, elemtype x)
//l為帶頭結點的單鏈表,刪除l中值為x的結點
else
//pre 和 p都向後移
}}
採用尾插法建立單鏈表,用 p 指標掃瞄 l 的所有結點,當其值不為 x 時,將其鏈結到 l 之後,否則將其釋放。
void
del_x
(linklist &l, elemtype x)
//l為帶頭結點的單鏈表,刪除l中值為x的結點
else
} r->next =
null
;//插入結束後將尾結點指標為null
}
這裡容易認為直接去掉 p 結點會造成斷鏈,實際上這裡每一層遞迴的l實際上就是上乙個節點的next,l的改變會導致上乙個節點的next值得改變。
設 l 為帶投結點的單鏈表,編寫演算法實現從尾到頭反向輸出每乙個結點的值。
用遞迴來實現,每當訪問乙個結點時,先遞迴輸出它後面的結點,再輸出該結點自身,這樣鍊錶就反向輸出了。
void
reverse
(linklist l)
試編寫在帶頭結點的單鏈表 l 中刪除乙個最小值結點的高效演算法(假設最小值結點是惟一的)
用 p 從頭到尾掃瞄單鏈表, pre 指向 *p 結點的前驅,用 minp 儲存值最小的結點指標,(初值為 p ), minpre 指向 *minp 結點的前驅 (初值為 pre )。一邊掃瞄,一邊比較,若 p->data 小於 min->data,則將 p ,pre 分別賦值給 minp,minpre,當 p 掃瞄完畢,minp 指向最小值的結點, minpre 指向最小值結點的前驅結點,再將 minp 所指結點刪除即可。
linklist delete_min
(linklist &l)
//l是帶有頭結點的單鏈表,本演算法刪除其最小值結點
pre = p;
//繼續掃瞄下乙個結點
p = p->next;
} minpre->next = minp->next;
//刪除最小值結點
free
(minp)
;return l;
}
試編寫演算法將頭結點的單鏈表就地逆置,所謂「就地」是指輔助空間複雜度為 o(1)
將頭結點摘下,然後從第一結點開始,依次插入到頭結點的後面(頭插法建立單鏈表),直到最後乙個結點為止。
這個題和 leetcode—— 206. 反轉鍊錶很相似。
linklist delete_min
(linklist &l)
//l是帶有頭結點的單鏈表,本演算法將l就地逆置
return l;
}
王道資料結構考研筆記之線性表的鏈式表示
1 單鏈表 單鏈表的定義 線性表的鏈式儲存又稱單鏈表,它是指任意一組儲存單元來儲存線性表中的資料元素。data 資料域 next 指標域 typedef struct lnodelnode,linklist 通常用頭指標來標識乙個單鏈表,如單鏈表l,頭指標為null時為空表。單鏈表在第乙個結點前附加...
資料結構 線性表 線性表的靜態鏈式表示
資料結構 線性表的靜態鏈式表示 單鏈表 靜態鍊錶 線性表元素序號從1算起 l 0 專設為頭結點 date 2017 4 14 include include define initsize 100 define elemtype char typedef struct lnodelinklist i...
資料結構 線性表的鏈式表示(鍊錶)
下面介紹第二種順序表,也就是鍊錶 鍊錶有兩個,單鏈表和雙鏈表,先介紹單鏈表 include includetypedef struct nodenode,linklist node creatlist1 node head return head void output node head int ...