Java 链表部分习题总结
一、链表的反转(Leedcode.206反转链表)
将一个链表进行反转,定义两个指针 一个代替头节点跑,另外一个指针是指向下一个节点。之后代替头节点的指针走向需要交换的节点进行类似头插法的操作,最终将链表反转。
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null) {
return null;
}
if (head.next == null) {
return head;
}
ListNode cur = head;
ListNode curNext = cur.next;
head.next = null;
cur = curNext;
while (cur != null) {
curNext = cur.next;
cur.next = head;
head = cur;
cur = curNext;
}
return head;
}
}
二、返回链表的中间节点(Leedcode.876 链表的中间节点)
如果链表是奇数个节点,返回中间节点
如果链表是偶数个节点,返回中间第二个节点
思路:定义快慢指针,快指针一次走两个节点,慢指针一次走一个节点,奇数节点fast.next等于null结束循环,偶数节点在fast等于null结束循环 之后慢指针就是想要的节点。
class Solution {
public ListNode middleNode(ListNode head) {
ListNode cur1=head;//慢指针
ListNode cur2=head;//快指针
while(cur2!=null&&cur2.next!=null){
//奇数偶数节点都要判断
cur1=cur1.next;
cur2=cur2.next.next;
}
return cur1;
}
}
三、返回链表倒数第K个节点
题解:给定一个K值,返回倒数第K个节点
1.首先要判断k是否合法,要时间复杂度低的情况下不能先遍历一边链表求链表长度和K比较,用巧办法判断快指针是否等于null来降低时间复杂度。
public class Solution {
public List