LeetCode刷题——数组1
链表定义
- 单链表
struct ListNode {
int val;
ListNode* next;
ListNode(int x): val(x),next(nullptr){}
};
- 双链表
struct DListNode {
int val;
DListNode *pre,*next;
ListNode(int x): val(x),pre(nullptr)next(nullptr){}
};
移除链表元素
题目链接.
- 题意:删除链表中所有满足
Node.val == val
的节点,并返回新的头节点 。 - 关键:如果删除头节点,怎么处理。
- 思路:使用一个虚拟头节点指向头节点
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//关键:虚拟头节点
ListNode * dummy = new ListNode(-1);
dummy->next=head;
ListNode *p=dummy;
while(p->next){
if(p->next->val==val) p->next=p->next->next;
else p=p->next;
}
return dummy->next;
}
};
反转链表
题目链接.
- 题意:反转一个单链表 。
如:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL。 - 关键:不浪费内存,不定义一个新的链表。
- 思路:
- 使用一个虚拟头节点指向头节点,然后在虚拟头节点和虚拟头节点之间,按顺序循环插入单链表的节点。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head==nullptr) return head;
ListNode* dummy = new ListNode(-1);
ListNode* p=head;
while(p){
ListNode* q=p->next;
p->next=dummy->next;
dummy->next=p;
p=q;
}
return dummy->next;
}
};
- 将单链表的指针方向反转
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* temp;
ListNode* cur = head;
ListNode* pre = NULL;
while(cur) {
temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
};
两两交换链表中的节点
题目链接.
- 题意:给定一个链表,两两交换其中相邻的节点。
如:
输入: 1->2->3->4->NULL 输出: 2->1->4->3->NULL。 - 关键:交换两个节点,要考虑交换节点的前后节点。
- 思路:先判断是否链表是否需要交换,不需要则直接返回
head
。将交换的两个节点设为p,q
,交换完之后第二个节点变成头节点,p,q变为后两个要交换的节点,当p为空或者q为空,则交换结束。
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head==nullptr||head->next==nullptr) return head;//判断是否需要交换
ListNode* p=head;
ListNode*q=p->next;
p->next=q->next;
q->next=p;
ListNode* h=q;//第二个节点交换后就变成了头节点
while(p->next){
ListNode* t=p;
p=p->next;
q=p->next;
if(q==nullptr) break;//
t->next=q;
p->next=q->next;
q->next=p;
}
return h;
}
};