diff --git a/lib/std/linked_list.zig b/lib/std/linked_list.zig index f9084a55c4..3b9ff4cfcd 100644 --- a/lib/std/linked_list.zig +++ b/lib/std/linked_list.zig @@ -61,6 +61,20 @@ pub fn SinglyLinkedList(comptime T: type) type { } return count; } + + /// Invert the list starting from this node in-place. + /// This operation is O(N). + pub fn invert(indirect: *?*Node) void { + if (indirect.* == null) { + return; + } + var current: *Node = indirect.*.?; + while (current.next) |next| { + current.next = next.next; + next.next = indirect.*; + indirect.* = next; + } + } }; first: ?*Node = null, @@ -149,6 +163,12 @@ test "basic SinglyLinkedList test" { try testing.expect(list.first.?.data == 2); try testing.expect(list.first.?.next.?.data == 4); try testing.expect(list.first.?.next.?.next == null); + + L.Node.invert(&list.first); + + try testing.expect(list.first.?.data == 4); + try testing.expect(list.first.?.next.?.data == 2); + try testing.expect(list.first.?.next.?.next == null); } /// A tail queue is headed by a pair of pointers, one to the head of the