Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>The key to this algorithm is to set two pointers <code>p1</code> and <code>p2</code> apart by <code>n-1</code> nodes initially so we want <code>p2</code> to point to the <code>(n-1)th</code> node from the start of the list then we move <code>p2</code> till it reaches the <code>last</code> node of the list. Once <code>p2</code> reaches end of the list <code>p1</code> will be pointing to the nth node from the end of the list.</p> <p>I've put the explanation inline as comments. Hope it helps:</p> <pre><code>// Function to return the nth node from the end of a linked list. // Takes the head pointer to the list and n as input // Returns the nth node from the end if one exists else returns NULL. LinkedListNode nthToLast(LinkedListNode head, int n) { // If list does not exist or if there are no elements in the list,return NULL if (head == null || n &lt; 1) { return null; } // make pointers p1 and p2 point to the start of the list. LinkedListNode p1 = head; LinkedListNode p2 = head; // The key to this algorithm is to set p1 and p2 apart by n-1 nodes initially // so we want p2 to point to the (n-1)th node from the start of the list // then we move p2 till it reaches the last node of the list. // Once p2 reaches end of the list p1 will be pointing to the nth node // from the end of the list. // loop to move p2. for (int j = 0; j &lt; n - 1; ++j) { // while moving p2 check if it becomes NULL, that is if it reaches the end // of the list. That would mean the list has less than n nodes, so its not // possible to find nth from last, so return NULL. if (p2 == null) { return null; } // move p2 forward. p2 = p2.next; } // at this point p2 is (n-1) nodes ahead of p1. Now keep moving both forward // till p2 reaches the last node in the list. while (p2.next != null) { p1 = p1.next; p2 = p2.next; } // at this point p2 has reached the last node in the list and p1 will be // pointing to the nth node from the last..so return it. return p1; } </code></pre> <p>Alternatively we can set <code>p1</code> and <code>p2</code> apart by n nodes instead of <code>(n-1)</code> and then move <code>p2</code> till the end of the list instead of moving till the last node:</p> <pre><code>LinkedListNode p1 = head; LinkedListNode p2 = head; for (int j = 0; j &lt; n ; ++j) { // make then n nodes apart. if (p2 == null) { return null; } p2 = p2.next; } while (p2 != null) { // move till p2 goes past the end of the list. p1 = p1.next; p2 = p2.next; } return p1; </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload