203.移除链表元素
题目链接
解题思路: 可以尝试虚拟头结点的方式,比较简便
代码如下:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyHead = new ListNode(0); //创建一个虚拟头结点,并初始化为0
dummyHead->next = head; //让虚拟头结点的下一个指向头结点
ListNode* cur = dummyHead; //现在的指针指向虚拟头结点
while(cur->next != NULL){
if(cur->next->val == val){
//ListNode* tmp = cur->next;
cur->next = cur->next->next;//将
//delete tmp;
}
else{
cur = cur->next;
}
}
head = dummyHead->next;
delete dummyHead;
return head;
}
};
707.设计链表
题目链接
解题思路: 使用虚拟头结点,实现增加,删除,插入节点。
代码如下:
class MyLinkedList {
public:
//定义链表节点结构体
struct LinkedNode{
int val;
LinkedNode* next;
LinkedNode(int val):val(val),next(NULL){}
};
MyLinkedList() {
dummyHead = new LinkedNode(0);
size = 0;
}
int get(int index) {
if(index < 0 || index > (size - 1)){
return -1;
}
LinkedNode * cur = dummyHead->next;
while(index--){
cur = cur->next;
}
return cur->val;
}
void addAtHead(int val) {
LinkedNode* newNode = new LinkedNode(val);
newNode->next = dummyHead->next;
dummyHead->next = newNode;
size++;
}
void addAtTail(int val) {
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* cur = dummyHead;
while(cur->next != NULL){
cur = cur->next;
}
cur->next = newNode;
size++;
}
void addAtIndex(int index, int val) {
if(index > size) return ;
if(index < 0) index=0;
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* cur = dummyHead;
while(index--){
cur = cur->next;
}
newNode->next = cur ->next;
cur->next = newNode;
size++;
}
void deleteAtIndex(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;
tmp = NULL;
size--;
}
void printLinkedList() {
LinkedNode* cur = dummyHead;
while (cur->next != nullptr) {
cout << cur->next->val << " ";
cur = cur->next;
}
cout << endl;
}
private:
int size;
LinkedNode* dummyHead;
};
*/
206.反转链表
题目链接
解题思路: 可以考虑两种方法,一种是双指针,一种是递归
双指针法
使用一前一后两个指针,当后面指针遇到NULL时候,遍历结束。
注意: ①改变指针方向的时候,要将cur->next保存一下,后面会发生改变
②更新pre 和 cur时,要先更新pre,如果先更新cur,值会发生改变。
代码如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
//使用双指针思想
ListNode *cur = head;
ListNode *pre = NULL;
ListNode *tmp = NULL;
while(cur){
tmp = cur->next; //保存一下 cur的下一个节点,因为接下来要改变cur->next;
cur->next = pre; //翻转操作
//更新pre和 cur指针,向后移动,先移动pre
pre = cur;
cur = tmp;
}
return pre;//cur此时指向空
}
};
递归法
和双指针法基本类似,代码更简练。
代码如下:
class Solution{
public:
ListNode* reverseList(ListNode* head){
return reverse(NULL,head);
}
ListNode* reverse(ListNode* pre,ListNode* cur){
if(cur==NULL) return pre;
ListNode* tmp = cur->next;
cur->next = pre;
return reverse(cur,tmp);
}
};