【剑指offer】7.删除链表的节点

总目录:

算法之旅导航目录

 

1.问题描述

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。

1.此题对比原题有改动
2.题目保证链表中节点的值互不相同
3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
数据范围:
0<=链表节点值<=10000
0<=链表长度<=10000

 
2.问题分析
可采取的方法:
1暴力迭代,注意维护目标节点的前一个节点;
2压栈弹栈;

3.代码实例

迭代法

 1 /**
 2  * struct ListNode {
 3  *  int val;
 4  *  struct ListNode *next;
 5  *  ListNode(int x) : val(x), next(nullptr) {}
 6  * };
 7  */
 8 class Solution {
 9   public:
10     /**
11      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
12      *
13      *
14      * @param head ListNode类
15      * @param val int整型
16      * @return ListNode类
17      */
18     ListNode* deleteNode(ListNode* head, int val) {
19         ListNode* pPre = NULL;//前一个节点
20         ListNode* pCur = head;//当前节点
21         while (pCur != NULL) {
22             //如果不等,继续迭代
23             if (pCur->val != val) {
24                 pPre = pCur;//
25                 pCur = pCur->next;
26                 continue;
27             }
28 
29             //前一个节点是否可用
30             if (pPre != NULL) {
31                 pPre->next = pCur->next;
32             } else {
33                 head = pCur->next;
34             }
35             break;
36         }
37 
38         return head;
39     }
40 };
View Code

 1 /**
 2  * struct ListNode {
 3  *  int val;
 4  *  struct ListNode *next;
 5  *  ListNode(int x) : val(x), next(nullptr) {}
 6  * };
 7  */
 8 class Solution {
 9   public:
10     /**
11      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
12      *
13      *
14      * @param head ListNode类
15      * @param val int整型
16      * @return ListNode类
17      */
18     ListNode* deleteNode(ListNode* head, int val) {
19         stack<ListNode*> sp;
20         ListNode* pCur = head;
21 
22         while (pCur != NULL) {
23             //压栈
24             if (pCur->val != val) {
25                 sp.push(pCur);
26                 pCur = pCur->next;
27                 continue;
28             }
29 
30             //发现目标值
31             if (sp.empty()) {
32                 head = pCur->next;
33             } else {
34                 sp.top()->next = pCur->next;
35             }
36             break;
37         }
38 
39         return head;
40     }
41 };
View Code

 


 
posted @ 2022-11-10 12:11  啊原来是这样呀  阅读(35)  评论(0编辑  收藏  举报