0
点赞
收藏
分享

微信扫一扫

LeetCode19. 删除链表的倒数第 N 个结点【双指针】

佳简诚锄 2022-02-06 阅读 32

LeetCode19. 删除链表的倒数第 N 个结点

文章目录

1.题目

在这里插入图片描述

2.思路

3.代码实现

(1) 倒序转正序

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
   	    int size = 0;//链表长度
		ListNode* dummyHead = new ListNode(-1,head);//哨兵结点
		ListNode* p = dummyHead;
		
		while(p->next!= NULL)//第一次遍历:统计链表长度 
		{
			p = p->next;
			size++;	//链表长度 
		} 
		
		int a = size-n+1;//待删除的结点正序所在位置 从1开始!! 
		if(a == 1)//特判头结点
		{
			ListNode*q = head;
			dummyHead->next = head->next;
			head = head->next;//连接节点
			delete q;
            delete dummyHead;
			return head;
		}
		else//其他情况
		{
			ListNode *q = dummyHead;
			//从哨兵结点出发 只需要走 待删除结点的所在正序-1 步即可
			int cnt = size-n;
			while(cnt--)//第二次遍历
				q = q->next;
			ListNode *m = q->next;
			q->next = m->next;//连接节点
			delete m;
            delete dummyHead;
			return head;
		}
    }
};

注意事项

(2) 双指针

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
		ListNode* dummyHead = new ListNode(-1,head) ;
		ListNode* fast = dummyHead;//快指针
		ListNode* slow = dummyHead;//慢指针
		int a = n+1;
		//1.快指针先走n+1步——为了使后期同步动时slow指向待删除结点的前一个,方便操作
		while(a--)
		fast = fast->next;//向后移n+1步
	
	   //2.快慢指针同步动,
		while(fast!=NULL)
		{
			slow = slow->next;
			fast = fast->next;
		} //此时slow指向待删除结点的前一个结点 
		
		//3.删除操作
		ListNode*p = slow->next;
		slow->next = p->next;
		delete p;
		return dummyHead->next; //注意这里!
    }
};
举报

相关推荐

0 条评论