目录
876.链表的中间结点
题目描述:
解决思路:
使用快慢指针,快指针走两步,慢指针走一步
当快指针为null的时候,慢指针就走到了中点(奇数)
当快指针为null的时候,慢指针就走到了后一个中点(偶数)代码:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ 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 ; } }
19.删除链表的倒数第N个结点
题目描述:
解题思路:
(1)让前面的指针先移动n步,之后前后指针共同移动直到前面的指针到尾部为止
(2)首先设立预先指针 pre
(3)设预先指针 pre 的下一个节点指向 head,设前指针为 start,后指针为 end,二者都等于 pre
(4)start 先向前移动n步
(5)之后 start 和 end 共同向前移动,此时二者的距离为 n,当 start 到尾部时,end 的位置恰好为倒数第 n 个节点
(6)因为要删除该节点,所以要移动到该节点的前一个才能删除,所以循环结束条件为 start.next != null
(7)删除后返回 pre.next,代码:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { //创建预先指针 ListNode pre = new ListNode(0) ; //预先指针指向头结点 pre.next = head ; //创建后指针 ListNode low = pre ; //创建前指针 ListNode high = pre ; //让前指针先走n步,当n=0时结束循环 while( n != 0 ){ //前指针走一步 high = high.next ; //n-1 n--; } //当前指针没有走到最后一个结点时,前后指针一起走 while (high.next != null){ //前指针走一步 high = high.next ; //后指针走一步 low = low.next ; } /* 当跳出上面第二个while时,low所指向的位置,便是需要删除的位置 删除的方法就是将low后面第二个数值赋给low下一个指向元素,可以画图更直观 */ low.next = low.next.next ; //返回pre.next,因为pre没有移动过,它的下一结点就是从头结点开始 return pre.next; } }