資料結構之單鏈表常見面試題(一)

2021-08-17 16:55:35 字數 3777 閱讀 3500

逆序列印單鏈表這裡用的是遞迴的列印方法。

void linklistreverse(linknode* head)

if(head->next ==

null)

linklistreverse(head->next);

printf("[%c|%p]\n",head->

data,head);

}

這裡進行對指標的改變指向,再進行覆蓋內容即可。

void linklistinsert2(linknode** phead, linknode* pos, linktype value)//在無頭單鏈表的乙個節點前插入乙個節點(不能遍歷鍊錶)

if(*phead ==

null)

linknode* cur = pos->next;

pos->next = creat(value);

pos->next->next = cur;

linktype tmp = pos->

data;

pos->

data

= value;

pos->next->

data

= tmp;

}

linknode* linklistjosephcircle(linknode** phead,size_t num)//實現約瑟夫環

if(*phead ==

null)

if((*phead)->next ==

null)

linknode* cur =

*phead;

while(cur->next !=

null)

cur->next =

*phead;

linknode* tmp =

null;

cur =

*phead;

while(1)

for(i =

1; i < num; i++)

tmp->next = cur->next;

free(cur);

cur = tmp->next;

}return cur;

}

這裡運用兩種方法進行逆置,一種是刪除後面插入至前面,另一種是對指標的指向進行移動。

void linklistreverse(linknode** phead)//逆置反轉單鏈表

if(*phead ==

null)

linknode* to_delete =

null;

linknode* cur =

*phead;

while(cur->next !=

null)

}void linklistreverse2(linknode** phead)//逆置反轉單鏈表

if(*phead ==

null)

linknode* cur = (*phead)->next;

linknode* pre =

*phead;

linknode* next =

null;

while(cur !=

null)

}

void swap(linktype* a, linktype* b)

void linklistbubblesort(linknode** phead)//氣泡排序鍊錶

if(*phead ==

null)

linknode* count =

*phead;

linknode* tail =

null;

linknode* cur =

*phead;

for(; count->next !=

null; count = count->next)

}tail = cur;

}}

linknode* linklistgetpos(linknode* head,size_t num)//查詢單鏈表的倒數第num個節點 ,要求只能遍歷一次鍊錶

linknode* cur = head;

linknode* tmp = head;

size_t i =

1; while(cur->next !=

null)

i++;

}return tmp;

}

這裡我們可以直接呼叫前面的找到第k個,然後直接erase

void linklisterasegetp(linknode** phead, size_t num)//刪除鍊錶的倒數第k個節點

if(*phead == null)

linknode* ret = linklistgetpos(*phead,num);

linklisterase(phead,ret);//此函式的實現在之前的單鏈表基本操作中有實現

}

利用兩個指標,一快一慢,如果快的能夠追上慢的,那麼帶環,返回其相遇的位置。

linknode* hascycle(linknode* head)//判斷鍊錶是否帶環,如果帶環返回相遇點位置

linknode* fast = head;

linknode* slow = head;

while(fast !=

null

&& fast->next !=

null)

}return

null;

}

size_t cyclelen(linknode* head)//求乙個有環鏈表的環長度

if(head->next ==

null)

linknode* meet_node = hascycle(head);

if(meet_node ==

null)

linknode* cur = meet_node->next;

size_t count =

1; while(cur != meet_node)

return count;

}

linknode* getcycleentry(linknode* head)//求乙個有環鏈錶環的入口點

if(head->next ==

null)

linknode* meet_node = hascycle(head);

if(meet_node ==

null)

linknode* cur = head;

while(cur != meet_node)

return cur;

}

linknode* hascross(linknode* head1, linknode* head2)//判斷兩個鍊錶是否相交

if(head2 ==

null)

linknode* cur1 = head1;

linknode* cur2 = head2;

while(cur1 !=

null

&& cur2 !=

null)

cur1 = cur1->next;

cur2 = cur2->next;

}return

null;

}

單鏈表常見面試題

ifndef linklist h define linklist h define crt secure no warnings include include include string h include typedef int datatype typedef struct node no...

單鏈表常見面試題

一 獲取單鏈表的節點個數 思路 遍歷鍊錶 head 煉表頭結點 param head return 方法 獲取到單鏈表結點的個數 如果是帶頭結點的鍊錶,不統計頭結點 public static int getlength heronode head int length 0 定義乙個輔助變數,沒有統...

單鏈表的常見面試題

單鏈表的基礎操作 單鏈表建立面試題 1.從尾到頭列印單鏈表 2.刪除乙個無頭單鏈表的非尾節點 不能遍歷鍊錶 3.在無頭單鏈表的乙個非頭節點前插入乙個節點 不能遍歷鍊錶 4.單鏈表實現約瑟夫環 josephcircle 5.逆置 反轉單鏈表 6.查詢單鏈表的中間節點,要求只能遍歷一次鍊錶 void p...