/*
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;
}