1. 程式人生 > >連結串列奇偶排序以及反轉問題

連結串列奇偶排序以及反轉問題

將連結串列中的所有元素為奇數的節點移到元素為偶數節點的前面,並使奇數之間順序反轉,偶數之間順序反轉
如交換前: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