[LeetCode] Remove Nth Node From End of List

简介: This is a classic problem of linked list. You may solve it using two pointers. The tricky part lies in the head pointer may also be the one that is required to be removed.

This is a classic problem of linked list. You may solve it using two pointers. The tricky part lies in the head pointer may also be the one that is required to be removed. Handle this carefully.

 1 class Solution {
 2 public:
 3     ListNode *removeNthFromEnd(ListNode *head, int n) {
 4         ListNode *pre, *cur;
 5         pre = cur = head;
 6         int i = 0;
 7         for(; i < n; i++)
 8             cur = cur -> next;
 9         if(!cur) return head -> next;
10         while(cur -> next) {
11             pre = pre -> next;
12             cur = cur -> next;
13         }
14         pre -> next = pre -> next -> next;
15         return head;
16     }
17 };

You may create a dummy that points to head to facilitate the removal.

 1 class Solution {
 2 public:
 3     ListNode* removeNthFromEnd(ListNode* head, int n) {
 4         ListNode* dummy = new ListNode(0);
 5         dummy -> next = head;
 6         ListNode* pre = dummy;
 7         ListNode* cur = dummy;
 8         for (int i = 0; i < n; i++)
 9             cur = cur -> next;
10         while (cur -> next) {
11             pre = pre -> next;
12             cur = cur -> next;
13         }
14         ListNode* del = pre -> next;
15         pre -> next = del -> next;
16         delete del;
17         return dummy -> next;
18     }
19 };

This link has a much shorter solution using pointers to pointers, which is a little difficult to understand. The code is rewritten below.

 1 class Solution {
 2 public:
 3     ListNode* removeNthFromEnd(ListNode* head, int n) {
 4         ListNode** pre = &head;
 5         ListNode* cur = head;
 6         for (int i = 1; i < n; i++)
 7             cur = cur -> next;
 8         while (cur -> next) {
 9             pre = &((*pre) -> next);
10             cur = cur -> next;
11         }
12         *pre = (*pre) -> next;
13         return head;
14     }
15 };

There is also a recursive solution to this problem in the answers in the above link. 

 1 class Solution {
 2 public:
 3     ListNode* removeNthFromEnd(ListNode* head, int n) {
 4         return countRemove(head, n) == 0 ? head -> next : head;
 5     }
 6 private:
 7     int countRemove(ListNode* node, int n) {
 8         if (!(node -> next)) return n - 1;
 9         int rest = countRemove(node -> next, n);
10         if (!rest) node -> next = node -> next -> next;
11         return rest - 1;
12     }
13 };

 

目录
相关文章
|
6月前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的长度,即节点数量。通过遍历这个属性,可以访问和处理所有节点。例如,示例代码加载&quot;books.xml&quot;,获取所有&quot;title&quot;节点,并依次输出它们的第一个子节点的值。
|
7月前
|
XML JavaScript 数据格式
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的元素数量。在示例中,代码加载&quot;books.xml&quot;,然后通过`getElementsByTagName(&quot;title&quot;)`获取所有标题节点。使用`for`循环遍历这些节点,输出每个标题的文本内容。这个例子展示了如何交互式地处理XML文档中的特定标签。
|
7月前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的元素数量。通过遍历这个属性,如`for (i=0;i&lt;x.length;i++)`,可以访问和处理每个节点。在示例中,代码加载&quot;books.xml&quot;,然后获取所有&quot;title&quot;标签,并打印它们的子节点值。
|
6月前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的元素数量。在示例中,代码加载&quot;books.xml&quot;,然后通过`getElementsByTagName(&quot;title&quot;)`获取所有标题节点。使用`for`循环遍历这些节点,输出每个标题的文本内容。
|
7月前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的长度。在示例中,代码加载&quot;books.xml&quot;,然后使用`getElementsByTagName(&quot;title&quot;)`获取所有标题节点。通过循环`x.length`,遍历并输出每个标题节点的第一个子节点的值。
|
6月前
|
XML JavaScript 数据格式
DOM 节点列表长度(Node List Length)
`length`属性表示DOM节点列表的长度。在示例中,通过加载&quot;books.xml&quot;到`xmlDoc`,并使用`getElementsByTagName(&quot;title&quot;)`获取所有标题节点,然后利用`for`循环遍历整个节点列表,每次迭代通过`childNodes[0].nodeValue`访问每个节点的第一个子节点的值并输出。此方法可用于处理XML或HTML文档中的节点列表。 **Markdown格式:** `length`属性表示DOM节点列表的长度。
|
6月前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性定义了节点列表的长度(即节点数量)。可通过此属性遍历节点列表。
|
7月前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的元素数量。通过它,可以迭代列表,如示例所示:加载&quot;books.xml&quot;,然后获取所有&quot;title&quot;节点。循环`x.length`,打印每个标题节点的第一个子节点的值。
|
7月前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的元素数量。通过遍历这个属性,如`for (i=0; i&lt;x.length; i++)`,可以访问和处理每个节点。在示例中,代码加载&quot;books.xml&quot;,然后获取所有&quot;title&quot;节点,并打印它们的第一个子节点的值。
|
7月前
|
XML JavaScript 数据格式
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的长度,即节点数量。通过它可遍历列表,如`for(i=0; i&lt;x.length; i++)`循环访问每个`title`节点,并输出其内容。示例展示了从&quot;books.xml&quot;加载XML后,获取并打印所有标题节点的值。