//两两交换链表内容比如原链表 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;
}