目錄
1.單鏈表的定義
2.獲取單鏈表的第i個元素
3.單鏈表的插入操作
4.單鏈表的刪除操作
5.單鏈表的整表刪除
6.判斷兩個單鏈表是否相交
7.如果兩個鍊錶相交,如何尋找相交的節點
8.判斷乙個單鏈表是否有環
9.如果乙個鍊錶有環,如何找到環的入口
10.找到單鏈表中的倒數第k個節點
11.兩個有序鍊錶的合併
12.找鍊錶的中間節點
typedef struct node
node;
typedef struct node* linklist;//定義鍊錶
bool getelem(linklist l, int i, int* e)
if (!p)
*e = p->data;
return true;
}
bool linkinsert(linklist l, int i, int e)
if (!p)
s = (node*)malloc(sizeof(node));//申請新的結點
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
bool listdelete(linklist l, int i, int* e)
if (!(p->next))
q = p->next;
p->next = q->next;
*e = q->data;
free(q);
return true;
}
bool clearlist(linklist l)
l->next = null;
return true;
}
bool iscut(linklist plist1, linklist plist2)
//先將長的鍊錶遍歷到和短鍊錶長度一樣的地方
for (int i = 0; i < len; ++i)
while (plong != null && pshort != null && plong != pshort)
//由於plong和pshort後面的長度是一樣的,且是同時向後遍歷的,如果跳出迴圈的條件不是
//plong==null,那麼也不是pshort==null,一定是plong==pshort且不等於null.
if (plong != null)
return false;
}
在第6個問題中,當條件:
if (plong != null)
成立的時候,plong和pshort會同時指向兩個鍊錶的相交點。
解法1:可以用hashset,將鍊錶依次遍歷存入hashset,如果在遍歷的過程**現了相同的節點,就表明這個鍊錶是有環的。
解法2:設定兩個指標,fast和slow,fast每次向前遍歷兩個節點,slow每次向前遍歷乙個節點,如果鍊錶有環,那麼slow會很快追上fast節點。
bool hascircle(linklist l)
} return false;
}
環入口的找尋
本人的另一篇部落格
本人的另一篇部落格
可以設立兩個指標,,fast和slow,fast每次向前遍歷兩個節點,slow每次向前遍歷乙個節點,當fast遍歷到鍊錶末端的時候,slow正好指向鍊錶的中間節點。
node* getmid(linklist l)
return slow;
}
單鏈表相關的面試題
slist.h void printlistfromtail2head pnode phead 從尾到頭列印單鏈表 void erasenottailnode pnode pos 刪除非尾結點 void insertfront pnode pos,datatype data 無頭單鏈表插入結點 vo...
單鏈表相關的面試題
pragma once include list.h 1.逆序列印單鏈表 template void list printtailtohead node phead 2.刪除無頭節點的單鏈表的非尾節點 template void list delnontailnode node pos 3.無頭單鏈...
單鏈表相關熱點面試題(一)
對於單鏈表相關的問題,往往是面試的熱點,在此我總結了一些單鏈表相關熱點面試題 一 比較順序表和煉表的優缺點,說說它們分別在什麼場景下使用?一 順序表的特點是邏輯上相鄰的資料元素,物理儲存位置也相鄰,並且,順序表的儲存空間需要預分配。它的優點是 1 方法簡單,各種高階語言中都有陣列,容易實現。2 不用...