【剑指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 };
栈
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 };