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。
  • 关键:不浪费内存,不定义一个新的链表。
  • 思路
  1. 使用一个虚拟头节点指向头节点,然后在虚拟头节点和虚拟头节点之间,按顺序循环插入单链表的节点。
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;
    }
};
  1. 将单链表的指针方向反转
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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值