連結串列奇偶排序以及反轉問題
將連結串列中的所有元素為奇數的節點移到元素為偶數節點的前面,並使奇數之間順序反轉,偶數之間順序反轉
如交換前:4->5->1->7->6
交換後:7->1->5->6->4
思路:申請兩個頭結點podd,peven分別指向奇數和偶數,開始遍歷連結串列,若為奇數,結點podd指向該結點;若為偶數,則結點peven指向該點。最後分別進行順序反轉。如只要輸出反轉結果,不改變指標結構,可以運用遞迴或者堆疊的方式輸出。
程式碼如下:
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct LNode
{
int value;
struct LNode *next;
};
LNode* createNode(int value)
{
LNode* p=new LNode();
//LNode *p=(LNode*)malloc(sizeof(LNode));
p->value=value;
p->next=NULL;
return p;
}
void ConnectNode(LNode *Pcurrent,LNode * Pnext)
{
if(Pcurrent==NULL)
{
printf("err to connection ");
exit(1);
}
Pcurrent->next=Pnext;
}
struct LNode* Reverse(LNode *p)
{
if(p==NULL )
return NULL ;
if( p->next==NULL)
return p;
LNode* phead=p;
LNode* temp=p->next;
while (temp)
{
LNode* pNext=temp->next;
temp->next=p;
p=temp;
temp=pNext;
}
phead->next=NULL;
return p;
}
void PrintNode(LNode* p)
{
if(p==NULL)
return ;
while(p)
{
printf("%d ",p->value);
p=p->next;
}
}
LNode* SwapNode(LNode* p)
{
LNode *Peven=new LNode(); //偶數連結串列
LNode *Podd=new LNode(); //奇數連結串列
LNode *PheadOdd=Podd;
LNode *PheadEven=Peven;
while(p!=NULL)
{
if(p->value%2==0)
{
Peven->next=p;
Peven=p;
}
else
{
Podd->next=p;
Podd=p;
}
p=p->next;
}
Peven->next=NULL;
Podd->next=NULL;
Podd=Reverse(PheadOdd->next);//5 7 1
//PrintNode(Podd);
Peven=Reverse(PheadEven->next);
//PrintNode(Peven);
p=Podd;
while(Podd->next)
{
Podd=Podd->next;
}
Podd->next=Peven;
return p;
}
int main()
{
LNode *pNode=createNode(4);
LNode *p1=createNode(5);
LNode *p2=createNode(1);
LNode *p3=createNode(7);
LNode *p4=createNode(6);
ConnectNode(pNode,p1);
ConnectNode(p1,p2);
ConnectNode(p2,p3);
ConnectNode(p3,p4); //連線結點 4->5->7->1->6
// PrintNode(p);
LNode *phead=SwapNode(pNode);
PrintNode(phead);
return 0;
}
相關推薦
連結串列奇偶排序以及反轉問題
將連結串列中的所有元素為奇數的節點移到元素為偶數節點的前面,並使奇數之間順序反轉,偶數之間順序反轉 如交換前:4->5->1->7->6 交換後:7->1->5->6->4 思路:申請兩個頭結點podd
連結串列奇偶分離,並且連結串列反轉
題目: 將連結串列中的所有元素為奇數的節點移到元素為偶數節點的前面,並使奇數之間順序反轉,偶數之間順序反轉。 示例: 交換前連結串列的順序 交換後連結串列的順序 4→5→7→1→6 ==> 1→7→5→6→4 1
LeeCode——中級演算法——連結串列——奇偶連結串列(JavaScript)
給定一個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。 請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 O(1),時間複雜度應為 O(nodes),nodes 為節點總數。 示例 1: 輸入:
演算法面試:單向連結串列節點的奇偶排序。
給定一個單項鍊表,要求實現一個演算法,把連結串列分成兩部分,前一部分全是下標為偶數的節點,後一部分全是下標為奇數的節點,例如給定連結串列為下圖的第一個佇列,要求編寫一個演算法,將連結串列轉換為第二個佇列: 要求演算法不能分配多餘的記憶體,同時,在操作連
編程題#3:奇偶排序(二)
log cnblogs 保存 比較 如果 () return names space #include <iostream> using namespace std; int main() { int n, a[1000]; // 一共n個數,n不超過
編程題#2:奇偶排序(一)
ios -- cout 如果 cin art 數組 n) bool 描述 輸入十個整數,將十個整數按升序排列輸出,並且奇數在前,偶數在後。 輸入 輸入十個整數 輸出 按照奇偶排序好的十個整數 #include <iostream> using name
數組中的排序分析及奇偶排序 - 算法數據結構面試分享(四)
排序;奇偶排序;首尾交換數組中的排序分析及奇偶排序 我們之前在課本上學習過一般的排序方法,如冒泡,快排,插入,歸並。其中時間復雜度有O(N), 和O(Nlogn), 以及O(N2)的。今天我們在這裏看一些特定情況下的排序,並否所有的排序都是基於大小的,有時待排序的數大小範圍是已知的,我們分別看兩個典型的例子
922. 按奇偶排序陣列 II (java)
文章目錄 題解1 題解2 題解1 用最直觀的的想法實現:就是遍歷陣列 將奇數位不為奇數的 和 下個偶數位不為偶數的交換 或者 偶數位不為偶數的交換 和 下個將奇數位不為奇數的。 class Solution { public
java 連結串列的氣泡排序,排序之後連結串列的結構是已經發生變化的,可以直接根據head+temp +next節點列印全部
package interview.datastructure; /** * 實現連結串列的插入和刪除結點的操作 */ public class Link_list { //定義一個結點 class Node { Node next = null; int d
147,對連結串列進行插入排序
對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。 插入排序演算法: 插入排序是迭代的,每次只移動一個元
leetcode - 922 - 按奇偶排序陣列 II
class Solution: def sortArrayByParityII(self, A): """ :type A: List[int] &nb
leetcode - 905 - 按奇偶排序陣列
class Solution: def sortArrayByParity(self, A): """ :type A: List[int]  
LeetCode142. Linked List Cycle||(環形連結串列)——— 判斷連結串列是否有環以及求其入環節點
struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(nullptr) {} }; //判斷連結串列是否有環 //方法: //1、空間複雜度n:使用set集合儲存每一個節點,判斷是否有重複 //2
leetcode147對連結串列進行插入排序
def insertionSortList(self, head): """ 對連結串列進行插入排序,單鏈表沒有前驅指標只能從前往後,新增一個輔助有序連結串列,依次從前比較 """ new_head = ListNode(0) ##
905. 按奇偶排序陣列
給定一個非負整數陣列 A,返回一個由 A 的所有偶數元素組成的陣列,後面跟 A 的所有奇數元素。 你可以返回滿足此條件的任何陣列作為答案。 示例: 輸入:[3,1,2,4] 輸出:[2,4,3,1] 輸出 [4,2,3,1],[2,4,1
147. 對連結串列進行插入排序
對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。 插入排序演算法: 插入排序是迭代的,每次只移動一
資料結構之連結串列C語言實現以及使用場景分析
連結串列是資料結構中比較基礎也是比較重要的型別之一,那麼有了陣列,為什麼我們還需要連結串列呢!或者說設計連結串列這種資料結構的初衷在哪裡? 這是因為,在我們使用陣列的時候,需要預先設定目標群體的個數,也即陣列容量的大小,然而實時情況下我們目標的個數我們是不確定的,因此我們總是要把陣列的容量設定的
leetcode 905. 按奇偶排序陣列【陣列】
題目: 給定一個非負整數陣列 A,返回一個由 A 的所有偶數元素組成的陣列,後面跟 A 的所有奇數元素。 你可以返回滿足此條件的任何陣列作為答案。 示例: 輸入:[3,1,2,4] 輸出:[2,4,3,1] 輸出 [
Leetcode 147 對連結串列進行插入排序
按照陣列插入排序的思路,需要把陣列分成以排序和未排序的兩部分: 每次從未排序的陣列中拿出一個插入已排序的陣列中,指到未排序陣列未空。在插入的過程中涉及到陣列的遍歷查詢,而陣列是可以按下標從後向前遍歷的: void InsertSort(int a[], int n) { for
leetcode.905 按奇偶排序陣列
給定一個非負整數陣列 A,返回一個由 A 的所有偶數元素組成的陣列,後面跟 A 的所有奇數元素。 你可以返回滿足此條件的任何陣列作為答案。 示例: 輸入:[3,1,2,4] 輸出:[2,4,3,1] 輸出 [4,2,3,1],[2,4,1