您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關LeetCode如何k個一組翻轉鏈表的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
給你一個鏈表,每 k 個節點一組進行翻轉,請你返回翻轉后的鏈表。
k 是一個正整數,它的值小于或等于鏈表的長度。
如果節點總數不是 k 的整數倍,那么請將最后剩余的節點保持原有順序。
給你這個鏈表:1->2->3->4->5
當 k = 2 時,應當返回: 2->1->4->3->5
當 k = 3 時,應當返回: 3->2->1->4->5
說明:
你的算法只能使用常數的額外空間。
你不能只是單純的改變節點內部的值,而是需要實際進行節點交換。
步驟分解:
時間復雜度為 O(n*K), 最好的情況為 O(n), 最差的情況未 O(n^2)O
空間復雜度為 O(1),除了幾個必須的節點指針外,我們并沒有占用其他空間。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseKGroup(self, head, k):
dummy = ListNode(0)
p = dummy
while True:
count = k
stack = []
tmp = head
while count and tmp:
stack.append(tmp)
tmp = tmp.next
count -= 1
# 注意,目前tmp所在k+1位置
# 說明剩下的鏈表不夠k個,跳出循環
if count :
p.next = head
break
# 翻轉操作
while stack:
p.next = stack.pop()
p = p.next
#與剩下鏈表連接起來
p.next = tmp
head = tmp
return dummy.next
/**
* 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->5
dummy.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指向2
for(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->1
pre.next=reverse(start);
//翻轉后頭節點變到最后。通過.next把斷開的鏈表重新鏈接。
start.next=next;
//將pre換成下次要翻轉的鏈表的頭結點的上一個節點。即start
pre=start;
//翻轉結束,將end置為下次要翻轉的鏈表的頭結點的上一個節點。即start
end=start;
}
return dummy.next;
}
//鏈表翻轉
// 例子: head:1->2->3->4
public 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<-4
preNode = curNode;//preNode 指針向后移動。preNode指向當前節點。
curNode = nextNode;//curNode指針向后移動。下一個節點變成當前節點
}
return preNode;
}
}
感謝各位的閱讀!關于“LeetCode如何k個一組翻轉鏈表”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。