链表刷题总结
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
查找一个链表的中间节点:使用快慢指针,
查找链表的倒数第几个结点也可以使用LeetCode--remove-nth-node-from-end-of-list,即让快指针先走k步,然后快慢指针一起走,当快指针走到头的时候,慢指针刚好走到那个位置的上一个结点。
注意:如果用途是对链表的左右分别递归调用时,需要将中间节点的前一个结点的next = null 即需要一个pre结点(注意先要赋null初始化)
ListNode midList(ListNode node){
if(node == null || node.next == null) return node;
ListNode slow = node, fast = node;
ListNode pre = null;
while(fast != null && fast.next != null){
pre = slow;
slow = slow.next;
fast = fast.next.next;
}
pre.next = null;
return slow;
}
反转一个链表,并返回头结点
ListNode reverse(ListNode node){
if(node == null || node.next == null) return node;
ListNode pre = null;
while(node != null){
ListNode next = node.next;
node.next = pre;
pre = node;
node = next;
}
return pre;
}
可以选择一个ListNode node = new ListNode(0)来作为前缀,到时候返回的时候直接返回node.next

浙公网安备 33010602011771号