Day3| 203.移除链表元素,707.设计链表 ,206.反转链表
移除链表元素
LeetCode题目链接:https://leetcode.cn/problems/remove-linked-list-elements/
解题思路
先看题目,因为要在链表中删去等于val值的元素,如果从head开始迭代会存在问题:如果head也需要被删去,那么需要对head进行特殊处理,以适应新的头结点,非常麻烦。
因此,首先初始化一个虚拟头结点来作为当前的头结点,不用担心头结点的特殊处理。之后进行迭代,如果指向的节点的下一个节点val符合要求,则将节点的next指向原先的next->next。
值得注意的是,当进行节点删除的操作后,不需要再将节点后移。以保证更新后的节点都可以被迭代到。否则相当于删去后跳过了一个节点。代码如下:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode *dummyHead = new ListNode(0,head);
ListNode *pre = dummyHead;
while(pre!=NULL&&pre->next!=NULL){
if(pre->next->val==val){
pre->next = pre->next->next;
continue;
}
pre = pre->next;
}
return dummyHead->next;
}
};
设计链表
LeetCode题目链接:https://leetcode.cn/problems/design-linked-list/
解题思路
观察可以得到,初始化时链表为空,为了给初始添加链表元素提供根据,在初始化阶段应当设置出一个虚拟头结点,以满足插入和删除元素的需要。同时,addAtIndex中存在索引参数,并且需要对索引参数进行判定,因此初始化中应当有方法对当前链表的长度进行统计。因此,还应该引入size变量来计入链表长度。
此后,addAtHead和addAtTail可以看成addAtIndex操作的一个特例。所以仅对增删和get进行重点书写。
注意事项:1、addAtIndex 方法中描述的“如果 index 等于链表的长度,则该节点将附加到链表的末尾” 这句话中 链表长度这里是指 size而不是size - 1,如果是size-1的话那就会和在最后一个元素前插入冲突了。2、这里的index是从0开始的。
具体代码如下:
class MyLinkedList {
public:
MyLinkedList() {
dummyhead = new ListNode(0);
size = 0;
}
int get(int index) {
if(index>=size){
return -1;
}
ListNode * head = dummyhead;
for(int i=0;i<index;i++){
head = head->next;
}
return head->next->val;
}
void addAtHead(int val) {
addAtIndex(0,val);
}
void addAtTail(int val) {
addAtIndex(size,val);
}
void addAtIndex(int index, int val) {
if(index>size){
return;
}
ListNode * temp = new ListNode(val);
ListNode * head = dummyhead;
for(int i=0;i<index;i++){
head = head->next;
}
temp = head->next;
head->next = new ListNode(val,temp);
size++;
}
void deleteAtIndex(int index) {
if(index>=size){
return;
}
ListNode * head = dummyhead;
for(int i=0;i<index;i++){
head = head->next;
}
head->next = head->next->next;
size--;
}
private:
int size;
ListNode * dummyhead;
};
反转链表
LeetCode题目链接:https://leetcode.cn/problems/reverse-linked-list/
解题思路
采用双指针迭代法,逐步对两两元素进行迭代。注意双指针初始值的选择,设为NULL可以满足链表末尾元素指向NULL的要求。
具体代码如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head==NULL||head->next==NULL){
return head;
}
ListNode *slow = NULL;
ListNode *fast = head;
ListNode *temp;
while(fast!=NULL){
temp = fast->next;
fast->next = slow;
slow = fast;
fast = temp;
}
return slow;
}
};