赞
踩
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链表的入口节点称为链表的头结点也就是head。
我的理解:链表的每个节点是一个结构体,结构体中包含一个数据val和一(多)个指针next,指针指向下(上)一个节点,头节点或者说每一个节点的表示都是一个指针,就是定义的该结构体的指针,以头节点为例,其声明是ListNode* head,但其实头节点是*head,这个才是结构体,而上述定义中所说的链表的入口节点称为链表的头结点也就是head则使用指针来表示节点。所以
head->next可以是指针,一定意义上也可以理解为下一个节点。
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
- /**
- * 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* var = new ListNode(0);//构造虚拟头节点的方法
- var->next = head;
- ListNode* temp;
- temp = var;
- while(temp->next != NULL)
- {
- if(temp->next->val == val)
- {
- ListNode* del;
- del = temp->next;//要设置临时变量存储要删除节点的地址
- temp->next = temp->next->next;
- delete(del);
- }
- else
- {
- temp = temp->next;
- }
- }
- head = var->next;
- delete(var);
- return head;*/
- //直接在原链表操作
- while(head != NULL && head->val == val)
- {
- ListNode* del = head;
- head = head->next;
- delete del;
- }
- ListNode* temp = head;
- while(temp != NULL && temp->next!= NULL)
- {
- if(temp->next->val == val)
- {
- ListNode* del = temp->next;
- temp->next = temp->next->next;
- delete del;
- }
- else
- {
- temp = temp->next;
- }
- }
- return head;
- }
- };
设计并实现自己的链表。
单链表中的节点应该具备两个属性:val
和 next
。val
是当前节点的值,next
是指向下一个节点的指针/引用。假设链表中的所有节点下标从 0 开始。
实现 MyLinkedList
类:
MyLinkedList()
初始化 MyLinkedList
对象。int get(int index)
获取链表中下标为 index
的节点的值。如果下标无效,则返回 -1
。void addAtHead(int val)
将一个值为 val
的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。void addAtTail(int val)
将一个值为 val
的节点追加到链表中作为链表的最后一个元素。void addAtIndex(int index, int val)
将一个值为 val
的节点插入到链表中下标为 index
的节点之前。如果 index
等于链表的长度,那么该节点会被追加到链表的末尾。如果 index
比长度更大,该节点将 不会插入 到链表中。void deleteAtIndex(int index)
如果下标有效,则删除链表中下标为 index
的节点。- class MyLinkedList {
- public:
- struct LinkedNode
- {
- int val;
- LinkedNode* next;
- LinkedNode(int val):val(val), next(nullptr){};
- };
- MyLinkedList() {
- _dummyHead = new LinkedNode(0);
- my_index = 0;
- }
-
- int get(int index) {
- if(index<0||index>(my_index-1))
- return -1;
- else
- {
- LinkedNode* temp;
- temp = _dummyHead->next;
- while(index--)
- {
- temp = temp->next;
- }
- return temp->val;
- }
- }
-
- void addAtHead(int val) {
- LinkedNode*_addHead = new LinkedNode(val);
- _addHead->next = _dummyHead->next;
- _dummyHead->next = _addHead;
- my_index++;
- }
-
- void addAtTail(int val) {
- LinkedNode*_addtail = new LinkedNode(val);
- LinkedNode*temp;
- temp = _dummyHead;
- int a = my_index;//这里不能更改链表的个数,所以取一个临时变量a
- while(a--)
- {
- temp = temp->next;
- }
- temp->next = _addtail;
- /*LinkedNode* newNode = new LinkedNode(val);
- LinkedNode* cur = _dummyHead;
- while(cur->next != nullptr){
- cur = cur->next;
- }
- cur->next = newNode;*/
- my_index++;
- }
-
- void addAtIndex(int index, int val) {
- if(index > my_index)
- return;
- if(index<0)
- index = 0;
- LinkedNode*_addindex = new LinkedNode(val);
- LinkedNode*temp;
- temp = _dummyHead;
- while(index--)
- {
- temp = temp->next;
- }
- _addindex->next = temp->next;
- temp->next = _addindex;
- my_index++;
- }
-
- void deleteAtIndex(int index) {
- if(index<0||index>=my_index)
- return;
- LinkedNode*temp;
- temp = _dummyHead;
- while((index)--)
- {
- temp = temp->next;
- }
- LinkedNode* del;
- del = temp->next;
- temp->next = temp->next->next;
- delete del;
- my_index--;
- }
- private:
- int my_index;
- LinkedNode* _dummyHead;
-
- };
-
- /**
- * Your MyLinkedList object will be instantiated and called as such:
- * MyLinkedList* obj = new MyLinkedList();
- * int param_1 = obj->get(index);
- * obj->addAtHead(val);
- * obj->addAtTail(val);
- * obj->addAtIndex(index,val);
- * obj->deleteAtIndex(index);
- */
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
- /**
- * 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* reverseList(ListNode* head) {
- ListNode* cur;
- ListNode* pre;
- ListNode* temp;
- cur = head;
- pre = NULL;
- while(cur != NULL)
- {
- temp = cur->next;
- cur->next = pre;
- pre = cur;
- cur = temp;
- }
- return pre;
- }
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。