the core is prev pointer is storing the current

while(current){
next = current.next
current.next = prev
prev = current
current = next
}

let discuss the part

[0,1,2,3,4]

**prev = null
current = {data:0,next:1}
next = null**

saving current.next in next (later use)

current = {data:0,next:1}
current.next contains {data:1,next:2}
current.next = prev {null}

now current modified {data:0,next:1} to {data:0,next:null}

prev = current so prev is null to {data:0,next:null}

current = next // now next stores the {data:1,next:2}

// next iteration

current = {data:1,next:2}
next = current.next {data:2,next:3}

current.next = prev {data:0,next:null}

now current has {data:1,next:{data:0,next:null}}

prev = current
//{data:0,next:null} to {data:1,next:{data:0,next:null}}

current = next {data:2,next:3}

//third iteration

current = {data:2,next:3}
next = current.next {data:3,next:4}

current.next = prev {data:1,next:{data:0,next:null}}

current has {data:2,next:{data:1,next:{data:0,next:null}}

prev = current
{data:1,next:{data:0,next:null}} to {data:2,next:{data:1,next:{data:0,next:null}}

current = next

{data:3,next:4}

//fourth iteration

current = {data:3,next:4}
next = current.next {data:4,next:null}

current.next = prev {data:2,next:{data:1,next:{data:0,next:null}}

current has {data:3,next:{data:2,next:{data:1,next:{data:0,next:null}}}

prev = current
{data:2,next:{data:1,next:{data:0,next:null}} to {data:3,next:{data:2,next:{data:1,next:{data:0,next:null}}}

current = next

{data:4,next:null}

//last iteration

current = {data:4,next:null}
next = current.next {null}

current.next = prev {data:3,next:{data:2,next:{data:1,next:{data:0,next:null}}}

current become {data:4,next:{data:3,next:{data:2,next:{data:1,next:{data:0,next:null}}}}

prev = current

current = next

completed
happy great coding