一. 反转链表
题目链接:https://leetcode.cn/problems/reverse-linked-list/description/
思路:
牛客上101的老熟人啦,首先定义一个cur指针模拟头结点,再定义一个pre指针指向null,模拟尾结点。
反转时,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。
为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。
接下来就是循环走逻辑,继续移动pre和cur指针。
最后,cur 指针从指向头结点到指向null,循环结束,链表也反转完毕。
此时我们return pre指针就可以了,因为pre指针经过反转后就变成了新的头结点。
代码:
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode pre = null;
ListNode cur = head;
while(cur != null) {
ListNode temp = cur,next;
cur.next = pre;
pre = cur;
cur = temp;
}
}
return pre;
}
二. 两两交换链表中的节点
题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/description/
思路:第二次遇到这个题咯,还是用老办法,递归!可能有些难以理解,多看几遍,多敲几次,慢慢理解。
代码:
class Solution {
public ListNode swapPairs(ListNode head) {
//特值判断
if(head == null || head.next == null) {
return head;
}
//获取当前节点的下一个结点
ListNode next = head.next;
//递归
ListNode newNode = swapPairs(next.next);
//交换
next.next = head;
head.next = newNode;
return next;
}
}
三. 删除链表的倒数第 N 个结点
题目链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
思路:第二次碰到了,没啥好说的,双指针就是yyds
代码:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//模拟头结点
ListNode newHead = new ListNode(0);
//将模拟头结点与链表链接起来
newHead.next = head;
//创建快慢双指针,都从头开始遍历
//此时的头就是虚拟头结点
ListNode fast = newHead;
ListNode slow = newHead;
//快指针先移动n个位置
for(int i = 0; i<n; i++) {
fast = fast.next;
}
//俩指针同时开始运动
while(fast.next != null) {
fast = fast.next;
slow = slow.next;
}
//此时,要删除的节点就是slow的前一个节点
slow.next = slow.next.next;
//返回虚拟头结点所链接的链表
return newHead.next;
}
}
今天遇到两道之前做过的,当复习啦