鍊錶常見問題(上)

2022-01-19 09:54:07 字數 2653 閱讀 2671

void slistprinttailtohead(slistnode*phead) 

printf(

"%d

", cur->_data);

tail =cur;

}}//遞迴實現

void slistprinttailtoheadr(slistnode*phead)

void slistdelnontailnode(slistnode*pos) 

void slistinsertfrontnode(slistnode*pos, datatype x)

約瑟夫環問題是乙個數學的應用問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為m的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去...直到圓桌只剩乙個人.(其實就和小時候玩丟手絹遊戲差不多)如每數到4就去掉乙個人:

//替換刪除法

next = cur->_next;

cur->_data = next->_data;

cur->_next = next->_next;

free

(next);

next =null;

}return

cur;

}結果

法一:slistnode* slistreverse1(slistnode*list) 

return

n1;}

法二:slistnode* slistreverse2(slistnode*list)

return

ptmp;

}

//氣泡排序void

slistbubblesort(slistnode*list)

cur = cur->_next;

next = next->_next;

} if(flag == 0) return ; //

鍊錶基本有序 跳出迴圈

end =cur;}}

//公升序slistnode* slistmerger(slistnode* list1, slistnode*list2)  

else

return

newlist;

}//非遞迴實現

slistnode* slistmerge(slistnode* list1, slistnode*list2)

else

slistnode* cur = newlist; //

確定後面的結點

while(list1 &&list2)

else

cur = cur->_next;

}if(list1 ==null)

else

return

newlist;

}

slistnode* slistfindmidnode(slistnode*list) 

return

slow;

}

//類似上面,同樣定義快慢指標,讓快指標提前指向第k個結點

slistnode* slistfindtailknode(slistnode*list, size_t k)

}while

(fast)

return

slow;

}

void slistdeltailknode(slistnode*list, size_t k)

}//fast slow 同時往後走

while

(fast)

slistnode* next = slow->_next;

slow->_next = next->_next;

free

(next);

next =null;

}

鍊錶常見問題

思路 快慢指標,慢指標每次移動一步,快指標每次移動兩步,如果存在環,那麼兩個指標一定會在環內相遇 把第二個煉表頭節點的頭接到第乙個鍊錶尾部,然後就轉換成判斷單鏈表是否有環的問題了 當快慢指標相遇後,將乙個指標固定在相遇點,另乙個指標回到鍊錶起始位置,然後兩指標每次都移動乙個node,當兩指標再次相遇...

鍊錶常見問題 2

這個問題大家在資料結構中是很常見的,這個問題說簡單也簡單,可是想不通的時候還是有點難度的,領扣對這道題的描述有以下幾種情況 領扣給的鍊錶節點定義方式 definition for singly linked list.class listnode 方法 public boolean hascycle...

鍊錶常見問題 有序合併

兩個有序鍊錶,合併後仍然有序。分析 容易想到的就是找頭,也就是判斷下兩個煉表頭結點val小的。然後採用尾部插入 從head插就覆蓋了 遍歷兩個鍊錶,每次取小的,知道有個鍊錶為空退出。在判斷有無剩餘非空的鍊錶,追加到尾部。author bohu83 public class mergerlist li...