Linked List - some basic questions?

Pages: 12
Jan 2, 2016 at 1:02pm
Delete_At_n should delete the node so it doesn't leak memory. Also, it assumes that there are at least N items in the list which may be okay but it's the sort of thing that should be documented.
Jan 2, 2016 at 9:38pm
Oh snap, I can't believe I forgot that!

So I guess a second temp variable is necessary then, so I can point it to the nth node and then free it.

Here is my updated Delete function:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void Delete_At_n(Node* &pToHead, int n)
{
    if(pToHead == 0)
        return;

    Node* temp = pToHead;

    if(n==1) // special case for deleting first node;
    {
        pToHead = temp->next; // point pToHead to wherever first node was linked to
        return;
    }

    for(int i=0; i<n-2; i++)   // go to n-1th node
    {
        temp = temp->next;
    }

    Node* temp2 = temp->next; // temp2 pointing to nth node
    temp->next = temp2->next; // point n-1th node to whatever nth node is pointing to
   
    delete temp2;



    return;
}


As for the second thing you mentioned, I understand, but right now I just want to get down the core concepts of linked lists. The codes im writing are simply to teach myself, so Im not really worried about error-handling right now. Im just assuming that a valid value of n is passed for the sake of simplicity.

Anything else that needs to be fixed?
Last edited on Jan 4, 2016 at 12:29am
Jan 3, 2016 at 3:56pm
Anything else that needs to be fixed?

You're still leaking the memory. :)
Jan 4, 2016 at 12:30am
You're still leaking the memory. :)


Gah! Fixed.
Jan 5, 2016 at 8:34am
Function to reverse the list. It seems to work fine. Suggestions/criticisms are welcomed.

I called it "Reverse_Iterative" as I'll be writing another reverse function which will be recursive.

1
2
3
4
5
6
7
8
9
10
11
12
13
void Reverse_Iterative(Node* &pToHead)
{
    Node* current = pToHead; // set current node to whatever pToHead is pointing to
    Node* previous = 0, *next; // for storing the address of previous and next nodes
    while(current != 0)
    {
        next = current->next; // store address of next node
        current->next = previous; // point current node to previous node
        previous = current; // update previous to the current node
        current = next; // move current up to next node
    }
    pToHead = previous; // pToHead now points at what used to be the 'last' node, now making it the first
}
Jan 8, 2016 at 10:16am
So I found this recursive solution online. It works but Im confused because of the last line:

1
2
3
4
5
6
7
8
9
void Reverse_Recursive(Node*& pToHead)
{
  Node* rest = pToHead->next;
  if (pToHead == 0 || rest == 0) return;
  Reverse_Recursive(rest);
  pToHead->next->next = pToHead;
  pToHead->next = 0;
  pToHead = rest; // what does this do? How does rest change?
}


How does this work? I tried drawing a diagram and went though this code twice, but Im still left confused by the final line. It seems to mess up my understanding of whats going on. I think I may be severely misunderstanding what is happening to the rest pointer.

I understand recursion in that I know lines 6-8 are only executed once the base case condition is fulfilled, with each 'return' pointing p to the previous node. So thats not the issue here.

Any help?
Last edited on Jan 8, 2016 at 10:20am
Jan 8, 2016 at 1:54pm
In order for the list to be reversed, the head pointer must point to the previously last node in the list.

Without line 8, that wouldn't happen. Keep in mind that rest will be pToHead in a recursive function call before line 8 is reached.
Topic archived. No new replies allowed.
Pages: 12