遇到了一种新的数据结构---链表
链表:通过指针串联在一起的线性结构,由数据域和指针域组成;通过指针进行临近元素的查找工作(这也是进行基本数据处理的核心)
链表的定义,在此需要对数据结构的定义进行了解了:
strct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
操作: 添加和删除节点都是需要对指针进行操作.
开始做题!!!
203.移除链表元素 :移除链表元素
思考:
1.对该链表进行遍历操作,删除等于给定值的元素;
2.通过对指针的操作完成删除目标;
3.头节点怎么办? ------->为头节点再加一个头结点.
ListNode* vitualHead = new ListNode(0);
vitualHead->next = head ;
ListNode* cur = vitualHead;
while(cur->next != NULL) {
if(cur->next->val == val) {
ListNode* temp = cur->next;
cur->next = cur->next->next;
delete temp;//是为了对这块进行管理和删除
} else {
cur = cur->next;
}
}
head = vitualHead->next;
delete vitualHead;
return head;
707.设计链表:设计链表
思考:
1.这道题比较繁复,只能一个个类函数去分析,队友给定条件进行判断,或删除,或增加;
class MyLinkedList {
public:
struct LinkedNode {
int val;
LinkedNode* next;
LinkedNode(int val):val(val), next(nullptr) {}
};
MyLinkedList() { //初始化MyLinkedList对象
_dummyHead = new LinkedNode(0);
_size = 0;
}
int get(int index) {
if(index >(_size - 1) || index < 0) {
return -1;
}
LinkedNode* cur = _dummyHead->next;
while(index--) {
cur = cur->next;
}
return cur->val;
}
void addAtHead(int val) {
LinkedNode* addHead= new LinkedNode(val);
addHead->next = _dummyHead->next;
_dummyHead->next = addHead;
_size++;
}
void addAtTail(int val) {
LinkedNode* tailHead = new LinkedNode(val);
LinkedNode* cur = _dummyHead;
while(cur->next != nullptr) {
cur = cur->next;
}
cur->next = tailHead;
_size++;
}
void addAtIndex(int index, int val) {
if(index > _size) return;
if(index < 0) return;
LinkedNode* addIndexHead = new LinkedNode(val);
LinkedNode* cur = _dummyHead;
while(index--) {
cur = cur->next;
}
addIndexHead->next = cur->next;
cur->next = addIndexHead;
_size++;
}
void deleteAtIndex(int index) {
if(index >= _size) return;
if(index < 0) return;
LinkedNode* cur = _dummyHead;
while(index--) {
cur = cur->next;
}
LinkedNode* temp = cur->next;
cur->next = cur->next->next;
delete temp;
_size--;
}
private:
int _size;
LinkedNode* _dummyHead;
};
206.反转链表 :反转链表
思考:仍然需要双指针,一个指针用来指示断开原链接时,下一个的位置,一个用来指示建立新链接时,需要指向的位置.
ListNode* temp; // 保存cur的下一个节点
ListNode* cur = head; //用来指向原来的链接
ListNode* pre = NULL; //需要被新节点指向
while(cur) {
temp = cur->next; // 保存一下 cur的下一个节点,因为接下来要改变cur->next
cur->next = pre; // 翻转操作,pre被指向
// 更新pre 和 cur指针
pre = cur; //更新pre的位置
cur = temp; //更新cur的位置
}
return pre;