Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- let poodwracaj d lst =
- let temp = ref None in (* zmienna pomocnicza do zamiany wskaźników *)
- let rec kth k d = (* k-ty element z listy d *)
- if k = 0 then d
- else kth (k - 1) d.next
- in
- (* zamienia wszystko między d1 i d2 *)
- let rec zamien d1 d2 =
- (* jeżeli mamy zamienić d1 z samym sobą, to zamieniamy jego wskaźnik *)
- (* następujący z poprzedzającym *)
- if d1 = d2 then
- begin
- temp := d1.next;
- d1.next <- d1.prev;
- d1.prev <- temp
- end
- else
- begin
- let d1p = d1.prev
- and d1n = d1.next
- and d2p = d2.prev
- and d2n = d2.next in
- begin
- (* zamieniamy wskaźniki z d1 na wskaźniki z d2 i vice versa*)
- d1.next <- d2n;
- d1.prev <- d2p;
- d2.next <- d1n;
- d2.prev <- d1p;
- (* rekurencyjnie zamieniamy wskaźniki w drzewie poprzedzającym d2 i następującym d1 *)
- zamien d1n d2p
- end
- end
- in
- let rec pom lst d =
- match lst with
- | [] -> ()
- | h::t ->
- let kon = kth h d in (* ostatni element, który będziemy zamieniać *)
- let nxt = kon.next in
- begin
- zamien d kon; (* zamień elementy od d do kon *)
- pom t nxt (* zrób to samo dla kolejnej liczby z listy *)
- end
- in pom lst d
- ;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement