K个一组翻转链表—leetcode25
生活随笔
收集整理的這篇文章主要介紹了
K个一组翻转链表—leetcode25
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給你一個鏈表,每?k?個節點一組進行翻轉,請你返回翻轉后的鏈表。
k?是一個正整數,它的值小于或等于鏈表的長度。
如果節點總數不是?k?的整數倍,那么請將最后剩余的節點保持原有順序。
示例:
給你這個鏈表:1->2->3->4->5
當?k?= 2 時,應當返回:?2->1->4->3->5
當?k?= 3 時,應當返回:?3->2->1->4->5
說明:
- 你的算法只能使用常數的額外空間。
- 你不能只是單純的改變節點內部的值,而是需要實際進行節點交換。
?方法二:
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/ class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (head == null || head.next == null){return head;}//定義一個假的節點。ListNode dummy=new ListNode(0);//假節點的next指向head。// dummy->1->2->3->4->5dummy.next=head;//初始化pre和end都指向dummy。pre指每次要翻轉的鏈表的頭結點的上一個節點。end指每次要翻轉的鏈表的尾節點ListNode pre=dummy;ListNode end=dummy;while(end.next!=null){//循環k次,找到需要翻轉的鏈表的結尾,這里每次循環要判斷end是否等于空,因為如果為空,end.next會報空指針異常。//dummy->1->2->3->4->5 若k為2,循環2次,end指向2for(int i=0;i<k&&end != null;i++){end=end.next;}//如果end==null,即需要翻轉的鏈表的節點數小于k,不執行翻轉。if(end==null){break;}//先記錄下end.next,方便后面鏈接鏈表ListNode next=end.next;//然后斷開鏈表end.next=null;//記錄下要翻轉鏈表的頭節點ListNode start=pre.next;//翻轉鏈表,pre.next指向翻轉后的鏈表。1->2 變成2->1。 dummy->2->1pre.next=reverse(start);//翻轉后頭節點變到最后。通過.next把斷開的鏈表重新鏈接。start.next=next;//將pre換成下次要翻轉的鏈表的頭結點的上一個節點。即startpre=start;//翻轉結束,將end置為下次要翻轉的鏈表的頭結點的上一個節點。即startend=start;}return dummy.next;}//鏈表翻轉// 例子: head: 1->2->3->4public ListNode reverse(ListNode head) {//單鏈表為空或只有一個節點,直接返回原單鏈表if (head == null || head.next == null){return head;}//前一個節點指針ListNode preNode = null;//當前節點指針ListNode curNode = head;//下一個節點指針ListNode nextNode = null;while (curNode != null){nextNode = curNode.next;//nextNode 指向下一個節點,保存當前節點后面的鏈表。curNode.next=preNode;//將當前節點next域指向前一個節點 null<-1<-2<-3<-4preNode = curNode;//preNode 指針向后移動。preNode指向當前節點。curNode = nextNode;//curNode指針向后移動。下一個節點變成當前節點}return preNode;}}?
?
?
總結
以上是生活随笔為你收集整理的K个一组翻转链表—leetcode25的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分割数组的最大值—leetcode410
- 下一篇: 三角形最小路径和—leetcode120