Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 870583
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 15, 20262026-05-15T10:30:04+00:00 2026-05-15T10:30:04+00:00

I am trying to understand Linux Kernel implementation of linked list and hash table.

  • 0

I am trying to understand Linux Kernel implementation of linked list and hash table. A link to the implementation is here. I understood the linked list implementation. But i am little confused of why double pointers is being used in hlist (**pprev). Link for hlist is here. I understand that hlist is used in implementation of hash table since head of the list requires only one pointer and it saves space. Why cant it be done using single pointer (just *prev like the linked list)? Please help me.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-15T10:30:05+00:00Added an answer on May 15, 2026 at 10:30 am

    The reason can be found in one of the comments:

     547/*
     548 * Double linked lists with a single pointer list head.
     549 * Mostly useful for hash tables where the two pointer list head is
     550 * too wasteful.
     551 * You lose the ability to access the tail in O(1).
     552 */
    

    If you had *prev instead of **pprev, and because we are trying to save memory, we don’t include *prev in the head, then our hlist implementation looks like this:

    struct hlist_head {
      struct hlist_node *first = null;
    };
    
    struct hlist_node {
      struct hlist_node *next;
      struct hlist_node *prev;
    };
    

    Notice that the prev pointer cannot point to the head, or head->first (unlike **pprev). This complicates the hlist implementation, as you’ll see when we implement hlist_add_before():

    void
    hlist_init(struct hlist_head *head) {
      head->first = null;  
    }
    
    void
    hlist_add_head(struct hlist_head *head, struct hlist_node *node) {
      struct hlist_node *next = head->first;
    
      head->first = node;
      node->next = next;
      node->prev = NULL;
      if (next) {
        next->prev = node;
      }
    }
    

    Notice that prev has nothing to point to, in the above imeplementation of hlist_add_head(). So, now when you implement hlist_add_before() it looks like this:

    void
    hlist_add_before(struct hlist_head *head,
                     struct hlist_node *node,
                     struct hlist_next *next) {
      hlist_node *prev = next->prev;
    
      node->next = next;
      node->prev = prev;
      next->prev = node;
    
      if (prev) {
        prev->next = node;
      } else {
        head->first = node;
      }
    }
    

    Notice that now we need to pass in head as well to hlist_add_before(), which requires an extra push instruction for pushing head on the stack. Besides, there’s an extra conditional check in the implementation, which further slows down things.

    Now, try implementing other hlist operations, with *prev instead of **pprev, and you’ll find out that your implementation is going to be slower than what you saw in the linux kernel.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Ask A Question

Stats

  • Questions 433k
  • Answers 433k
  • Best Answers 0
  • User 1
  • Popular
  • Answers
  • Editorial Team

    How to approach applying for a job at a company ...

    • 7 Answers
  • Editorial Team

    What is a programmer’s life like?

    • 5 Answers
  • Editorial Team

    How to handle personal stress caused by utterly incompetent and ...

    • 5 Answers
  • Editorial Team
    Editorial Team added an answer NVI is an idiom, Template Method is a pattern. NVI… May 15, 2026 at 2:50 pm
  • Editorial Team
    Editorial Team added an answer Use cronjob to execute each 5 minutes a php script… May 15, 2026 at 2:50 pm
  • Editorial Team
    Editorial Team added an answer Qt uses pixels as a measure for widget size; but… May 15, 2026 at 2:50 pm

Trending Tags

analytics british company computer developers django employee employer english facebook french google interview javascript language life php programmer programs salary

Top Members

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.