203. 移除链表元素
//添加虚拟结点法
ListNode* removeElements(ListNode* head, int val) {
ListNode *vNode = new ListNode();//申请头结点
ListNode *tmp, *p;
vNode->next = head;
p = vNode;
while(p->next){
if (p->next->val == val) {
tmp = p->next;
//不移动到下一个结点,下一个结点的val==val
p->next = tmp->next;
delete tmp;
}else{
//移动到下一个结点
p = p->next;
}
}
return vNode->next;
}
//不带头结点的情况
ListNode* removeElements(ListNode* head, int val) {
ListNode *p, *q;
//处理头结点为val的情况
while(head && head->val == val) head = head->next;
//处理其他情况
p = head;
while(p && p->next) {
if (p->next->val == val) {
q = p->next;
p->next = q->next;
delete q;
}else {
p = p->next;
}
}
return head;
}
707. 设计链表
public:
//构建结点
struct ListNode{
int val;
ListNode *next;
ListNode(int val):val(val), next(nullptr) {}
};
//初始化
MyLinkedList() {
//设置一个头结点并将值初始化为0,方便op
_head = new ListNode(0);
_size = 0;
}
int get(int index) {
//index非法, 返回-1
if (index < 0 || index > _size-1) return -1;
ListNode *p = _head->next;
while(index--) p = p->next;
return p->val;
}
void addAtHead(int val) {
ListNode *p = new ListNode(val);
p->next = _head->next;
_head->next = p;
_size++;
}
//有可能是第0个 所以不能是 q = _head->next!
void addAtTail(int val) {
ListNode *p = new ListNode(val);
ListNode *q = _head;
//找到最后一个元素
while (q->next) q = q->next;
q->next = p;
_size++;
}
void addAtIndex(int index, int val) {
//等于长度,加到队尾
if (index > _size) return;
if (index < 0) index = 0;
ListNode *newNode = new ListNode(val);
ListNode *p = _head;
while(index){
p = p->next;
index--;
}
newNode->next = p->next;
p->next = newNode;
_size++;
}
void deleteAtIndex(int index) {
if (index < 0 || index > _size-1) return;
ListNode *p = _head, *q;
while(index--) p = p->next;
q = p->next;
p->next = q->next;
delete q;
_size--;
}
private:
ListNode *_head;
int _size;
};
206. 反转链表
ListNode* reverseList(ListNode* head) {
ListNode *p, *q;
//如果头结点为空,直接返回
if (head == NULL || head->next == NULL) return head;
//如果不为空
p = head->next;
head->next = NULL;
//头插法
while(p){
q = p->next;
p->next = head;
head = p;
p = q;
}
return head;
}