func(l *List) reverse_every_n_chunk_naive(n int) { if n <= 1 { return } if l.sentinel.next == nil { // Empty list return }
var num_elems = 0 { var cur_node = l.sentinel.next for cur_node != nil { num_elems++ cur_node = cur_node.next } }
var slice = make([]int, num_elems) { var cur_node = l.sentinel.next var i = 0 for cur_node != nil { slice[i] = cur_node.elem cur_node = cur_node.next i++ } }
for i := 0; i < num_elems; i++ { if (i+1)%n == 0 { // reverse the last n elems for j := 1; j <= n/2; j++ { // swap pairs, e.g. i-(n-1) and i-0 var x = i - (j - 1) var y = i - (n - 1) + (j - 1) slice[x], slice[y] = slice[y], slice[x] } } }
// Rewire the passed in List var cur_node = &l.sentinel for _, v := range slice { cur_node.next = &Node{elem: v} cur_node = cur_node.next } }
func(l *List) reverse_every_n_chunk(n int) { if n <= 1 { return } var final_node_in_prev_chunk = &l.sentinel
var cur = l.sentinel.next for i := 0; cur != nil; i++ { var next = cur.next if (i+1)%n == 0 { // cur is the end of current chunk
// Nested loop for nodes inside current chunk // [first, cur] var first = final_node_in_prev_chunk.next
// Pretend prev is start of next chunk var prev = next var nested_cur = first for j:=1; j<=n; j++ { var next_node = nested_cur.next nested_cur.next = prev
// After reverse: [cur, first] final_node_in_prev_chunk.next = cur final_node_in_prev_chunk = first } cur = next } }
funcis_list_eq(a *List, b *List)bool { var a_cur = a.sentinel.next var b_cur = b.sentinel.next for { if a_cur == nil && b_cur == nil { returntrue } if a_cur == nil && b_cur != nil { returnfalse } if a_cur != nil && b_cur == nil { returnfalse } if a_cur.elem != b_cur.elem { returnfalse } a_cur = a_cur.next b_cur = b_cur.next } }
func(l *List) clone() List { var result = List{} var input_cur = l.sentinel.next var out_cur = &result.sentinel for input_cur != nil { out_cur.next = &Node{elem: input_cur.elem} out_cur = out_cur.next
input_cur = input_cur.next } return result }
funclist_from_slice(slice []int) List { var result = List{} var cur = &result.sentinel for _, v := range slice { cur.next = &Node{elem: v} cur = cur.next } return result }
funcqcheck(loop int) { forrange loop { var slice = make([]int, 100) var n = rand.Intn(len(slice) + 2) for i := range slice { slice[i] = i + 1 } var list = list_from_slice(slice)
var x_list = list.clone() var y_list = list.clone()