目录
==================================================
19.删除链表中的倒数第n个结点
题目描述
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
- 链表中结点的数目为
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
题目链接
解题思路与代码
就看这个例子,n = 2,
我们思路就是通过一个nhead虚拟头节点,然后定义left和right两个指针来求解。
假设链表一共m个结点,然后删除倒数第n个结点。
先让right 向右移动n个结点
然后让left和right同步移动
然后此时我们发现left->next就是要删除的结点,然后我们直接left->next = left->next ->next;
就可以求解,同时我们需要注意,需要对left->next进行delete操作,防止链表中只存在一个结点的情况。nhead->next就是我们最后返回结果。
这个方法原理就是,先然right移动n,那么之后left和right同步移动,相当于移动(m - n)次,这样left就处于了我们要删除节点的前一个结点,从而简化问题。
(c++代码)
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* nhead = new ListNode(0);
nhead ->next = head;
ListNode* left = nhead;
ListNode* right = nhead;
while( n -- ) {
right = right ->next;
}
while(right != NULL && right ->next != NULL) {
left = left->next;
right = right ->next;
}
ListNode* tem = left ->next;
left->next = left->next->next;
delete(tem);
return nhead ->next;
}
};
24.两两交换链表中的结点
题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内 0 <= Node.val <= 100
题目链接
解题思路与代码
本题就是交换相邻结点,然后我们还是创立一个虚拟头节点pre ,然后我们使用cur进行遍历。
一次交换
二次交换
最终返回pre ->next即可
(c++ 代码)
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* nhead = new ListNode();
nhead ->next = head;
ListNode* cur = nhead;
while( cur ->next != NULL && cur ->next ->next != NULL) {
ListNode* start = cur ->next;
ListNode* end = cur ->next ->next;
cur ->next = end;
start ->next = end ->next;
end ->next = start;
cur = start;
}
return nhead ->next;
}
};