首页 > 其他 > 详细

【链接】删除链表的倒数第N个节点

时间:2020-05-01 22:59:11      阅读:67      评论:0      收藏:0      [点我收藏+]

题目:

给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

 

解答:

可以假设设定了双指针p和q的话,当q指向末尾的NULL,p与q之间相隔的元素个数为n时,那么删除掉p的下一个指针就完成要求了。

(1)设定虚拟节点dummyhead,指向head;

(2)设定双指针p和q,初始都指向虚拟节点dummyhead;

(3)移动q,直到q和q之间相隔的元素个数为n;

(4)同时移动p与q,直到q指向的为NULL;

(5)将p的下一个节点指向下下个节点;

 

具体代码如下所示。

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* removeNthFromEnd(ListNode* head, int n) {
12         ListNode* dummyHead = new ListNode(0);
13         dummyHead->next = head;
14 
15         ListNode* p = dummyHead;
16         ListNode* q = dummyHead;
17         for( int i = 0 ; i < n + 1 ; i ++ ){
18             q = q->next;
19         }
20 
21         while(q){
22             p = p->next;
23             q = q->next;
24         }
25 
26         ListNode* delNode = p->next;
27         p->next = delNode->next;
28         delete delNode;
29 
30         ListNode* retNode = dummyHead->next;
31         delete dummyHead;
32 
33         return retNode;
34     }
35 };

 

【链接】删除链表的倒数第N个节点

原文:https://www.cnblogs.com/ocpc/p/12814769.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!