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