HackerRank‐Linked Lists - a920604a/leetcode GitHub Wiki


title: Linked Lists categories: - interview-preparation-kit - HackerRank comments: false

Insert a node at a specific position in a linked list

SinglyLinkedListNode* insertNodeAtPosition(SinglyLinkedListNode* llist, int data, int position) {
    SinglyLinkedListNode* ret = new SinglyLinkedListNode(-1), *p = ret;
    ret->next = llist;
    SinglyLinkedListNode * node = new SinglyLinkedListNode(data);
    while(position-->0) p=p->next;
    if(!p->next) {
        p->next = node;
        p->next->next = nullptr;
    }
    else{
        SinglyLinkedListNode * post = p->next;
        p->next = node;
        node->next = post;
    }
    return ret->next;
}

Inserting a Node Into a Sorted Doubly Linked List

DoublyLinkedListNode* sortedInsert(DoublyLinkedListNode* llist, int data) {
    DoublyLinkedListNode * node = new DoublyLinkedListNode(data);
    DoublyLinkedListNode* ret = new DoublyLinkedListNode(-1), *p=ret;
    p->next = llist;
    DoublyLinkedListNode * pre ;
    while(p && p->data < data) {
        pre = p;
        p=p->next;
    }
    if(p==nullptr){
        pre->next= node;
        node->prev = pre;
    }
    else{
        p->prev = node;
        node->next = p;
        node->prev = pre;
        pre->next = node;
    }
    return ret->next;

}

Reverse a doubly linked list

DoublyLinkedListNode* reverse(DoublyLinkedListNode* llist) {
    if(!llist || !llist->next) return llist;
    DoublyLinkedListNode * pre = nullptr, *cur = llist;
    while(cur->next){
        DoublyLinkedListNode * post = cur->next;
        cur->next = pre;
        if(pre) pre->prev=cur;
        pre=cur;
        cur=post;
    }
    cur->next = pre;
    if(pre) pre->prev=cur;
    return cur;
}

Find Merge Point of Two Lists

int findMergeNode(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) {
    
    SinglyLinkedListNode *p = head1, *q=head2;
    while(p != q){
        if(p->next == nullptr) p=head1;
        else p=p->next;
        if(q->next == nullptr) q=head2;
        else q=q->next;
    }
    return p->data;
}

Linked Lists: Detect a Cycle

bool has_cycle(Node* head) {
    // Complete this function
    // Do not write the main method
    Node *slow =head, *fast = head;
    while(fast && fast->next){
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast) return true;
    }
    return false;
}