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;
}
//氣泡排序voidslistbubblesort(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...