逆序列印單鏈表這裡用的是遞迴的列印方法。
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...