两两交换链表内容

在这里插入图片描述


//两两交换链表内容比如原链表 1、2、3、4  交换后 2、1、4、3
    ListNode* swapPairs(ListNode* head)
    {
    ┊   ListNode*dummyhead=new ListNode(0);
    ┊   ListNode*cur=dummyhead;
    ┊   ListNode*tmp,*tmp1;
    ┊   dummyhead->next=head;//虚头节点指向头结点while(cur->next!=nullptr &&cur->next->next!=nullptr)//不满足交换条件即cur后面没有节点或者只有一个就不满足两两交换{
    ┊   ┊   tmp=cur->next;//保存当前节点的下个节点下来
    ┊   ┊   tmp1=cur->next->next->next;//保存当前节点的下下个节点下来
    ┊   ┊
    ┊   ┊   cur->next=cur->next->next;//1.步骤一
    ┊   ┊   cur->next->next=tmp;//2.步骤二
    ┊   ┊   cur->next->next->next=tmp1;//步骤三
    ┊   ┊   cur=cur->next->next;//改变当前节点}//以下内容为打印交换后内容
    ┊   ListNode*p=dummyhead->next;while(p){
    ┊   ┊   cout<<p->val<<" ";
    ┊   ┊   p=p->next;
    ┊
    ┊   }
    ┊   cout<<""<<endl;return dummyhead->next;

    }

测试代码:

class Solution
{
    public:
    struct ListNode
    {int val;struct ListNode*next;ListNode(int val):val(val),next(nullptr){}
    };

//1. 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
    ListNode*addAtHead(int val)
    {
    ┊   ┊ListNode* newNode = new ListNode(val);
    ┊   newNode->next = _dummyHead->next;
    ┊   _dummyHead->next = newNode;return _dummyHead->next;}

// 2.打印链表
    void printLinkedList()
    {
    ┊   ┊ListNode* cur = _dummyHead;
    ┊   ┊while (cur->next != nullptr){
    ┊   ┊   cout << cur->next->val << " ";
    ┊   ┊   cur = cur->next;}
    ┊   cout << endl;
    }
//3.删除链表的倒数第n个链表

    ListNode*removeNthFromEnd(ListNode*head,int n)
    {
    ┊   ListNode*dummyhead=new ListNode(0);
    ┊   ListNode*fast=dummyhead;//快指针
    ┊   ListNode*low=dummyhead;//慢指针
    ┊   dummyhead->next=head;//虚头指针指向头指针for(int i=0;i<n+1;i++)//让快指针先走n+1步{
    ┊   ┊   fast=fast->next;}while(fast)//当快指针为空说明到头了{
    ┊   ┊   fast=fast->next;
    ┊   ┊   low=low->next;}
    ┊   ListNode*del=low->next;//需要删除的节点为慢指针的下个节点
    ┊   low->next=del->next;//改变指向delete del;//删除节点
    ┊
    ┊   delete dummyhead;//删除虚头节点return head;//返回头结点
    }

//两两交换链表内容比如原链表 1、2、3、4  交换后 2、1、4、3
    ListNode* swapPairs(ListNode* head)
    {
    ┊   ListNode*dummyhead=new ListNode(0);
    ┊   ListNode*cur=dummyhead;
    ┊   ListNode*tmp,*tmp1;
    ┊   dummyhead->next=head;//虚头节点指向头结点while(cur->next!=nullptr &&cur->next->next!=nullptr)//不满足交换条件即cur后面没有节点或者只有一个就不满足两两交换{
    ┊   ┊   tmp=cur->next;//保存当前节点的下个节点下来
    ┊   ┊   tmp1=cur->next->next->next;//保存当前节点的下下个节点下来
    ┊   ┊
    ┊   ┊   cur->next=cur->next->next;//1.步骤一
    ┊   ┊   cur->next->next=tmp;//2.步骤二
    ┊   ┊   cur->next->next->next=tmp1;//步骤三
    ┊   ┊   cur=cur->next->next;//改变当前节点}//以下内容为打印交换后内容
    ┊   ListNode*p=dummyhead->next;while(p){
    ┊   ┊   cout<<p->val<<" ";
    ┊   ┊   p=p->next;
    ┊
    ┊   }
    ┊   cout<<""<<endl;return dummyhead->next;

    }

ListNode* _dummyHead= new ListNode(0);


};


int main()
{
    Solution *s=new Solution;
    s->addAtHead(20);
    s->addAtHead(30);
    s->addAtHead(40);
    Solution::ListNode*ret=s->addAtHead(50);
    s->printLinkedList();
    s->swapPairs(ret);



    /*
    s->removeNthFromEnd(ret,1);
    s->printLinkedList();
*/
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知道起个啥名“”

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值