链表刷题总结

 * 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

  

posted @ 2018-07-09 17:46  SkyeAngel  阅读(171)  评论(0编辑  收藏  举报