一、刷题
力扣19,删除链表的倒数第N个节点
使用快慢指针,快慢指针从虚拟头节点出发,快指针先走n+1步,然后快慢指针同时移动直到快指针指向NULL,此时慢指针的后一个元素即是要删除的元素。
注意:使用虚拟头结点在返回时不能返回head而要返回dummyHead->next
整体代码:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
//定义双指针和虚拟头结点
ListNode* dummyNode = new ListNode(0);
dummyNode->next = head;
ListNode* slow = dummyNode;
ListNode* fast = dummyNode;
//将快指针移动n+1位
while (n-- && fast != nullptr) {
fast = fast->next;
}
fast = fast->next;
//快慢指针同时移动,直到快指针指向NULL
while (fast != nullptr) {
fast = fast->next;
slow = slow->next;
}
//slow后一个节点就是倒数第N个节点
ListNode * tmp = slow->next;
slow->next = slow->next->next;
delete tmp;
return dummyNode->next;
}
};
力扣24,两两交换链表中的节点
本体需要注意的就是交换两个节点的写法
整体代码
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead = new ListNode(0,head);
ListNode* cur = dummyHead;
while (cur->next != nullptr && cur->next->next != nullptr) {
ListNode* tmp1 = cur->next;
ListNode* tmp2 = cur->next->next->next;
//交换节点
cur->next = cur->next->next;
cur->next->next = tmp1;
cur->next->next->next = tmp2;
cur = cur->next->next;
}
return dummyHead->next;
}
};
力扣206,反转链表
注意反转链表不是交换节点,而是反转节点的指向,这里使用双指针就行了
整体代码
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = nullptr;
ListNode* cur = head;
while (cur != nullptr) {
ListNode* tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};
力扣203,移除链表元素
这题需要注意的就是while循环中会出现空指针报错,需要在if判断后用else,不放在else中就会报错
整体代码:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyHead = new ListNode(0, head);
ListNode* cur = dummyHead;
ListNode* pre = dummyHead->next;
while (pre != NULL) {
if (pre->val == val) {
cur->next = pre->next;
pre = cur->next;
} else {
pre = pre->next;
cur = cur->next;
}
}
ListNode* tmp = dummyHead->next;
delete dummyHead;
return tmp;
}
};