移除链表元素
classSolution{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;}};
设计链表
classMyLinkedList{public:// 定义链表节点结构体structLinkedNode{int val;
LinkedNode* next;LinkedNode(int val):val(val),next(nullptr){}};// 初始化链表MyLinkedList(){
_dummyHead =newLinkedNode(0);// 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点
_size =0;}// 获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点intget(int index){if(index >(_size -1)|| index <0){return-1;}
LinkedNode* cur = _dummyHead->next;while(index--){// 如果--index 就会陷入死循环
cur = cur->next;}return cur->val;}// 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点voidaddAtHead(int val){
LinkedNode* newNode =newLinkedNode(val);
newNode->next = _dummyHead->next;
_dummyHead->next = newNode;
_size++;}// 在链表最后面添加一个节点voidaddAtTail(int val){
LinkedNode* newNode =newLinkedNode(val);
LinkedNode* cur = _dummyHead;while(cur->next !=nullptr){
cur = cur->next;}
cur->next = newNode;
_size++;}// 在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。// 如果index 等于链表的长度,则说明是新插入的节点为链表的尾结点// 如果index大于链表的长度,则返回空// 如果index小于0,则在头部插入节点voidaddAtIndex(int index,int val){if(index > _size)return;if(index <0) index =0;
LinkedNode* newNode =newLinkedNode(val);
LinkedNode* cur = _dummyHead;while(index--){
cur = cur->next;}
newNode->next = cur->next;
cur->next = newNode;
_size++;}// 删除第index个节点,如果index 大于等于链表的长度,直接return,注意index是从0开始的voiddeleteAtIndex(int index){if(index >= _size || index <0){return;}
LinkedNode* cur = _dummyHead;while(index--){
cur = cur ->next;}
LinkedNode* tmp = cur->next;
cur->next = cur->next->next;delete tmp;
_size--;}// 打印链表voidprintLinkedList(){
LinkedNode* cur = _dummyHead;while(cur->next !=nullptr){
cout << cur->next->val <<" ";
cur = cur->next;}
cout << endl;}private:int _size;
LinkedNode* _dummyHead;};
反转链表
classSolution{public:
ListNode*reverseList(ListNode* head){
ListNode* temp;// 保存cur的下一个节点
ListNode* cur = head;
ListNode* pre =NULL;while(cur){
temp = cur->next;// 保存一下 cur的下一个节点,因为接下来要改变cur->next
cur->next = pre;// 翻转操作// 更新pre 和 cur指针
pre = cur;
cur = temp;}return pre;}};
感受:
题目不难,但是注意细节,得多练习
这部分学起来比较吃力,还得再找点资料看看
明天继续加油
时长2h