从尾到头打印链表 (反转链表)

题目描述

输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
 

本质就是反转链表! 注意两点即可. 
    1) 注意空指针异常 
    2)注意最后一个元素要指向它的前一个元素
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> res= new ArrayList<>();
        if(listNode==null)
            return res;
        ListNode pre=null;
        while(listNode.next!=null){
            ListNode tempNode=listNode.next;
            listNode.next=pre;
            pre = listNode;
            listNode=tempNode;
        }
        listNode.next=pre;
        while(listNode!=null){
            res.add(listNode.val);
            listNode = listNode.next;
        }
        return res;
    }
}

 

 

进阶题:

  k个一组反转链表!!!!

25. K 个一组翻转链表

难度困难

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

 

示例:

给你这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

 

说明:

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

 

思考: 反转链表还是那个反转链表,外面再加上一个循环进行控制即可。  ( 难的是代码中的一些细节!!!! )

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode dummy = new ListNode(0);
        dummy.next=head;
        ListNode pre = dummy;
        ListNode end = dummy;
        while(end!=null){
            for(int i=0;i<k && end!=null;i++){
                end = end.next;
            }
            if(end==null)
                break;
            ListNode next = end.next;
            end.next=null;
            ListNode start = pre.next;
            pre.next=reverse(start);
            start.next=next;
            pre=start;
            end=pre;
        }
        return dummy.next;
    }

    ListNode reverse(ListNode cur){
        ListNode pre = null;
        while(cur!=null){
            ListNode tempNode = cur.next;
            cur.next=pre;
            pre=cur;
            cur=tempNode;
        }
        return pre;
    }
}

 

 

 

 

 

 

posted @ 2020-08-27 09:41  你眼里的星辰  阅读(90)  评论(0)    收藏  举报