🎓反转一个单链表。
题目描述
反转很好理解,就是我们生活中所说的颠倒,反转后原来链表的头节点变成尾结点,尾结点变成头节点,链表内容的顺序相反就行了。
题目链接
基本思路
好理解的双指针(c里面的是指针,java里面是引用变量)
- 定义两个指针: pre和 cur ;pre在前 cur在后,pre的初始值为null,用它记录要反转节点的前一个节点的地址,cur里面开始存头节点的地址,指向头节点。
cur之后向后移动遍历整个链表,每次让cur的next指向pre ,实现一次局部反转,局部反转完成之后,pre 和 cur同时往后移动一个位置循环上述过程,直至 pre 到达链表尾部。
3.但在cur的next指向pre之前,要定义一个临时变量存储cur后面节点的地址,如果没有提前存储cur后面节点的地址,cur的next指向了pre,cur后面所有的节点都将找不到了。
代码实现:
//声明一个类
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val=val;
}
}
class Solution {
public ListNode reverseList(ListNode head) {
//申请节点,pre和 cur,pre指向null
ListNode pre = null;
ListNode cur = head;
ListNode tmp = null;
while(cur!=null) {
//记录当前节点的下一个节点
tmp = cur.next;
//然后将当前节点指向pre
cur.next = pre;
//pre和cur节点都前进一位
pre = cur;
cur = tmp;
}
return pre;
}
}
动图演示
🎓返回链表的中间结点
题目描述:
题目很好理解,只是注意下,当链表元素个数为偶数的时候,中间节点有两个,题目说的是返回第二个中间节点,还有有时候可能遇到叫返回第一个节点的情况。
题目连接
基本思路:
📝比较经典的做法是:快慢指针
首先如果链表没有节点或者只有一个节点,直接返回null,什么都不做。如果有两个以上的节点,使用两个指针变量,刚开始都位于链表的第 1 个结点,一个永远一次只走 1 步,一个永远一次只走 2 步,一个在前,一个在后,同时走。循环走向去,这样当快指针走完的时候,慢指针就来到了链表的中间位置。这也很好理解就像跑步一样,甲乙两人一起跑步,甲的速度是乙的两倍,当他们走相同的时间的时候,乙走的路程是甲的一半,乙在甲走的路程中点处。
对于循环的条件fast!=null&&fast.next!=null,自己画个偶数,画个奇数的图,就明白了不能单独的是fast.next!=null为判断条件,不然偶数那里会发生空指针异常。
class Solution {
public ListNode middleNode(ListNode head) {
if(head==null||head.next==null) {
//如果链表为空直接返回null
return head;
}
ListNode fast=head;
ListNode slow=head;
while (fast!=null&&fast.next!=null) {
slow=slow.next;//走一步
fast=fast.next.next;//走两步
}
return slow;
}
}
动图演示:
偶数情况:
奇数情况:
🎓输入一个链表,输出该链表中倒数第k个结点
题目描述:
题目连接
基本思路:
方法一: