LeetCode 19 删除链表的倒数第N个节点 题解

论坛 期权论坛 脚本     
匿名网站用户   2020-12-19 13:34   114   0

题目大意:给定一个链表,删除倒数第N个元素。

分析:有两种方法:

1.两遍循环,第一遍用来确定倒数第N个元素是正着数第几个位置,第二遍循环用来找到这个元素并删除;

2.一遍循环,但是要控制两个指针first与second,我们首先设置一个虚拟头结点dummy,然后将first与second指针均指向dummy,接着将first指针向前移动到第N+1个元素,这个时候再同时向队尾移动双指针,当first指针到达队尾后为空的时候,first指针就指向了将要删除的指针的前一个元素。(这种移动指针感觉得多画一下,空想容易想乱了)

注意:虚拟头结点dummy挺好用的,可以在直接for(int i = 1; i <= n; i++)就移动到第n个位置,直接从真实head移动的话得稍微分类一下或者调整一下i的开始下标。

方法一代码:

ListNode* removeNthFromEnd(ListNode* head, int n) {
 int len = 0;
 ListNode *tmp = head, *last = NULL;
 while(tmp != NULL) {
  len++;
  tmp = tmp -> next;
 }
 int index = len - n + 1;
 if(index == 1) {
  if(head -> next == NULL) {
   return NULL;
  } else {
   return head -> next;
  }
 }
 if(index == 2) {
  head->next = head->next->next;
  return head;
 }
 ListNode *left, *right;
 tmp = head;
 for(int i = 2; i <= index; i++) {
  tmp = tmp -> next;
  if(i == index - 1) {
   left = tmp;
  }
  if(i == index) {
   right = tmp -> next;
  }
 }
 left->next = right;
 return head;
}

方法二代码:

ListNode* removeNthFromEnd(ListNode* head, int n) {
 ListNode *dummy = new ListNode(0);
 dummy -> next = head;
 ListNode *first = dummy, *second = dummy;
 for(int i = 1; i <= n + 1; i++) {
  first = first -> next;
 }
 while(first != NULL) {
  first = first -> next;
  second = second -> next;
 }
 ListNode *tmp = (second -> next) -> next;
 second -> next = tmp;
 return dummy -> next;
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP