第一题:移除链表元素
1.C++在清除节点的时候,记得释放内存
2.清除头节点的时候,跟其他的有一点不一样,区别在于直接删去头结点,把第二个节点往上移动一位,或者可以设置一个虚拟头结点,最后返回的时候return dummyNode->next;
3.链表最后一个结点:n->next=NULL;判断一个节点不是最后一个,直接n->next!=NULL
while (cur != NULL && cur->next!= NULL)
4.直接使用原来的链表进行移除结点操作,不设置虚拟头结点:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 删除头结点
while (head != NULL && head->val == val) { // 注意这里不是if
ListNode* tmp = head;
head = head->next;
delete tmp;
}
// 删除非头结点
ListNode* cur = head;
while (cur != NULL && cur->next!= NULL) {
if (cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
} else {
cur = cur->next;
}
}
return head;
}
};
其中删除头结点示意图:
删除非头结点示意图:
5.设置虚拟头结点方法
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作
ListNode* cur = dummyHead;
while (cur->next != NULL) {
if(cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
} else {
cur = cur->next;
}
}
head = dummyHead->next;
delete dummyHead;
return head;
}
};
设置虚拟头结点删除结点方法:
第二题:设计链表
1.利用虚拟头结点,对表内所有结点进行操作
2.如果涉及下表index,可以用一个cur来控制结点的遍历,
LinkedList* cur=_xuniHead;
while(index--)
{
cur=cur->next;
}
3.cur 不需要释放,为删除结点设置的tmp才需要释放
4.释放一个结点(如delete tmp)之后,这个结点的内存并没被完全清除,只是变成了野指针,需要tmp=nullptr规范一下。
第三题:反转链表
1.不是很熟悉,对于结点指针的动态变化需要理解
2.需要一个空指针,作为尾结点的指向
循环示意图