1. 链表中倒数第k个结点
题目描述:
输入一个链表,输出该链表中倒数第k个结点。
题目来源:牛客-链表中倒数第k个结点
分析:
先分析 k 有没有超过代码长度,超过了直接返回空值。
若没有超过,采用快慢指针的方法:快慢指针的距离相差 k 。
代码:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
// 快慢指针的方法求
public ListNode FindKthToTail(ListNode head,int k) {
ListNode forword = head;
ListNode backword = head;
ListNode cur = head;
int len = 0;
while (cur != null) {
cur = cur.next;
len++;
}
if (k > len)
return null;
while (k>0) {
forword = forword.next;
k--;
}
while (forword != null) {
forword = forword.next;
backword = backword.next;
}
return backword;
}
}
2. 反转链表
题目描述:
输入一个链表,反转链表后,输出新链表的表头。
题目来源:牛客-反转链表
分析:
1–>2–>3–>4–>5–>NULL
5–>4–>3–>2–>1–>NULL
对以下代码【head.next = p2; // 头插法链接节点】进行分析:
head | p2 |
---|---|
1 | 1->null |
2 | 2->1->null |
3 | 3->2->1->null |
4 | 4->3->2->1->null |
5 | 5->4->3->2->1->null |
代码:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
// 改变指针的方向
public ListNode ReverseList(ListNode head) {
ListNode p1 = null;
ListNode p2 = null;
while (head != null){
p1 = head.next; // 记录每一步的下一个值
head.next = p2; // 头插法链接节点
p2 = head; // 记录连接好的节点
head = p1; // 要进行头插的节点
}
return p2;
}
}