从尾到头打印链表 (反转链表)
题目描述
输入一个链表,按链表从尾到头的顺序返回一个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; } }
也许会有遗憾,但是不应该在失败之前
浙公网安备 33010602011771号