0
点赞
收藏
分享

微信扫一扫

代码随想录day5

皮皮球场 2024-05-29 阅读 11

/*

leetcode   24. 两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:

给定 1->2->3->4, 你应该返回 2->1->4->3.

*/

#include <iostream>
#include <vector>
using namespace std;
struct ListNode{
    int val;
    ListNode* next;
    ListNode(int x): val(x), next(NULL){}
};
class Solution{
public:
    ListNode* swapPairs(ListNode* head){
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head; //虚拟头指针指向head
        ListNode* cur = dummyHead;
        while(cur->next !=NULL && cur->next->next != NULL){
            ListNode* tmp = cur->next;  //1头
            //ListNode* tmp1 = cur->next->next;  //2头
            ListNode* tmp2 = cur->next->next->next;  //3头

            cur->next = cur->next->next; //指向1节点变成指向2节点
            tmp->next = tmp2;  //2尾3头变成2节点的next
            cur->next->next = tmp;  //2节点变成1节点

            //下一轮
            cur = cur->next->next;
        }
        ListNode* result = dummyHead->next;
        delete dummyHead;
        return result;
    }
};
int main(){
    vector<int> v = {1,2,3,4};
    ListNode* head = new ListNode(v[0]);
    ListNode* cur = head;
    for(int i = 1; i < v.size(); ++i){
        cur->next = new ListNode(v[i]);
        cur = cur->next;
    }
    Solution s;
    ListNode* result = s.swapPairs(head);
    while(result != NULL){
        cout << result->val;
        cout << " -> ";
        result = result->next;
    }
}

/*

leetcode 19.删除链表的倒数第N个节点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

进阶:你能尝试使用一趟扫描实现吗?

输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]

1:一种容易想到的方法是,我们首先从头节点开始对链表进行一次遍历,得到链表的长度 LLL。随后我们再从头节点开始对链表进行一次遍历,当遍历到第 L−n+1L-n+1L−n+1 个节点时,它就是我们需要删除的节点。

2:也可以在遍历链表的同时将所有节点依次入栈。根据栈「先进后出」的原则,我们弹出栈的第 nnn 个节点就是需要删除的节点,并且目前栈顶的节点就是待删除节点的前驱节点。这样一来,删除操作就变得十分方便了。

3:快慢指针法

*/

#include <iostream>
#include <vector>
using namespace std;
struct ListNode{
    int val;
    ListNode* next;
    ListNode(int x): val(x), next(NULL){}
};
class Solution{
public:
    ListNode* removeNthFromEnd(ListNode* head, int n){
        ListNode* dummyHead = new ListNode(0);//val=0, next=head
        dummyHead->next = head; //虚拟头指针指向head
        ListNode* first = head;  //first = 1
        ListNode* second = dummyHead; //second =0
        for(int i = 0; i < n; i++){  //i = 0 ,first = 2  i = n-1,first = n+1
            first = first->next;
        }
        while(first){  
            first = first->next;
            second = second->next;
        }//从后先前,first= NULL,second为倒数第N+1个,
        second->next = second->next->next; 
        ListNode* ans = dummyHead->next;  //head
        delete dummyHead;     
        return ans;   
    }
};
int main(){
    vector<int> v = {1,2,3,4,5};
    ListNode* head = new ListNode(v[0]);
    ListNode* p = head;
    for(int i = 1; i < v.size(); i++){
        p->next = new ListNode(v[i]);
        p = p->next;
    }
    Solution s;
    ListNode* ans = s.removeNthFromEnd(head, 2);
    while(ans){
        cout<<ans->val<<" ";
        ans = ans->next;
    }
    return 0;
}

举报

相关推荐

0 条评论