203
给你一个链表的头节点
head
和一个整数val
,请你删除链表中所有满足Node.val == val
的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]示例 2:
输入:head = [], val = 1 输出:[]示例 3:
输入:head = [7,7,7,7], val = 7 输出:[]提示:
- 列表中的节点数目在范围
[0, 104]
内1 <= Node.val <= 50
0 <= val <= 50
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* vir_head;//虚拟头节点
vir_head=(ListNode*)malloc(sizeof(ListNode));
vir_head->next=head;
ListNode* cur = vir_head;//设一个指针,用于遍历查询
//遍历指针的下一个非空意味着所有数据尚未遍历完
while (cur->next != NULL) {
//找到需要删除的节点
if (cur->next->val == val) {
cur->next = cur->next->next;
}
//下一个节点不是要找的节点就继续往前遍历
else {
cur = cur->next;
}
}
head = vir_head->next;
return head;
}
};
要开始非常纠结为什么一直是cur指针在操作,但是却改变了原来的链表:
后来得出结论是:
A->B->C->D->E
比方说如上面的链表,当指针cur指向B节点时,cur->next就相当于(等于)B->next,所以 cur->next=cur->next->next表面是操作cur,实际上是操作了B节点,而cur=cur->next就是cur指针自身的移动,移动到B节点的指针域next指向的对象处。
206
给你单链表的头节点
head
,请你反转链表,并返回反转后的链表。示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2:
输入:head = [1,2] 输出:[2,1]示例 3:
输入:head = [] 输出:[]提示:
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = NULL;
ListNode* cur = head;
ListNode* tmp = new ListNode();
while (cur != NULL) {
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};