Reverse a linked list using Golang

As we start coding and slowly learning about Data Structures(DS), we come across a very famous linear data structure which is known as a linked list. Linked lists and their related questions are quite popular in interviewers who love problem-solving.

What is a Linked List?

A linked list is a common linear data structure. its elements are also known as **Node** are not stored at a contiguous location. The nodes are linked using pointers. Linked lists are popular as their size is not fixed like an array. Linked list’s each node contains a value and a pointer to the next node. The head pointer points to the first node, and the last node of the list points to null. When the linked list is empty, the head pointer points to null.

Types of Linked Lists:
1. Singly Linked List (Uni-directional)
2. Doubly Linked List (Bi-directional)
3. Circular Linked List

I’ll write about linked list types in a different post as this post about reversing a linked list.


  1. Dynamically increase in size
  2. Easy to insertion/deletion


  1. Accessing a random node is not allowed.
  2. Additional memory space needs for each node in a linked list.
  3. Not cache friendly.

Linked List

Node for a linked list

type Node struct {
    prev *Node
    next *Node
    key interface{}

type LinkedList struct {
    head *Node
    tail *Node

Push method for a Linked List

func (ll *LinkedList) Push(key interface{}) {
    list := &Node{
        next: ll.head,
        key: key,
    if ll.head != nil {
        ll.head.prev = list
    ll.head = list
    l := ll.head
    for != nil {
        l =
    ll.tail = l

Display a Linked list

func (ll *LinkedList) Display() {
    list := ll.head
    for list != nil {
        fmt.Printf("%+v ->", list.key)
        list =

// normal display function
func Display(list *Node) {
    for list != nil {
        fmt.Printf("%v ->", list.key)
        list =

Reverse a Linked list

func (ll *LinkedList) Reverse() {
    currentNode := ll.head
    var next *Node
    var previousNode *Node
    ll.tail = ll.head

    for currentNode != nil {
        next, =, previousNode
        previousNode, currentNode = currentNode, next
    ll.head = previousNode

If you like, you can read the same article on my Personal Blog

Main function

func main() {
    link := LinkedList{}

    fmt.Printf("Head: %v\n", link.head.key)
    fmt.Printf("Tail: %v\n", link.tail.key)
    fmt.Printf("head: %v\n", link.head.key)
    fmt.Printf("tail: %v\n", link.tail.key)

// output
Head: 3
Tail: 9
3 -> 1 -> 8 -> 15 -> 12 -> 9 -> 
9 -> 12 -> 15 -> 8 -> 1 -> 3 -> 
head: 9
tail: 3

Yml or Yaml for DevOps

As software engineers, we are always learning new tech stacks as we process our careers. Everyone who works on any short of software farm all came across a term called DevOps. As the name suggests, ...

Working with DocuSign, Authorization and Sending Document for Signature

DocuSign is a well known platform where users can send their document for signing via email or your app. I will try to show you how DocuSign authorize an user and how can we send a document to users ...

Worker Pool in Golang

Tags: #advance #topic #golang #goroutine #channels #workerpool #threadpool Often we end up with some work which is so time-consuming that if we’re able to assign, multiple person/worker, to do ...
java web application

Top 9 Practical Benefits Of Using Java Web Application

Java web application frameworks have one of the greatest and largest communities of software engineers in the world. Companies can build a team with the help of this community at ease. There are different communities to help beginners, intermediate as well as expert developers.

Read More