1,反转一个单链表
采用头插法即可
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null){
return head;
}
ListNode cur = head.next;
head.next =null;
while(cur != null){
ListNode curN = cur.next;
cur.next = head;
head= cur ;
cur = curN;
}
return head;
}
}
2,链表的中间结点
给你单链表的头结点 head
,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
所以应该这样写:
class Solution {
public ListNode middleNode(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next!=null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
}
3.找出单向链表中倒数第 k 个节点
class Solution {
public int kthToLast(ListNode head, int k) {
ListNode fast = head;
ListNode slow = head;
if(k<=0 ){
return -1;
}
//1,先让fast走k-1步
int count= 0;
while(count != k-1){
fast=fast.next;
//判断k过大而出现的错误
if(fast==null){
return -1;
}
count++;
}
//2,然后一起走 ,当fast走到最后一个节点时 slow就是倒数第k个节点的位置
while(fast.next != null){
fast=fast.next;
slow=slow.next;
}
return slow.val;
}
}