鏈表反轉python
① c語言,鏈表的反轉怎麼寫代碼
單鏈表反轉很簡單,只說下思路:
1,從頭到尾循環遍歷鏈表
2,取下頭結點,作為尾結點,尾結點此時也為頭結點
3,採用前插法,將步驟二中取下的結點一個一個連接到頭結點前面,成為新的頭結點。
4,鏈表全部遍歷完後,新的鏈表產生了,是原來鏈表的反轉。
② 給個鏈表,翻轉相鄰的節點,即0和1翻轉,2和3翻轉,用python
#Definitionforsingly-linkedlist.
#classListNode(object):
#def__init__(self,x):
#self.val=x
#self.next=None
classSolution(object):
defswapPairs(self,head):
"""
:typehead:ListNode
:rtype:ListNode
"""
ifhead==None:
returnNone;
ifhead.next==None:#只有一個節點的情況
returnhead;
node=head;
result=head.next;#交換之後鏈表的頭節點
whilenodeandnode.next:#還存在下一對節點
temp=node.next;#作節點交換處理
node.next=temp.next;
temp.next=node;
temp=node.next;
iftempandtemp.next:#如果下對節點有兩個的話,當前這對節點第二個節點指向下對節點的第二個節點
node.next=temp.next;
node=temp;
returnresult;
③ 用C++程序實現鏈表的反轉,需要詳細分析
#include<iostream>
using namespace std;
struct LinkNode {
int data; //數據
LinkNode* pNext = NULL;//下個節點指針
};
LinkNode* pLast;
LinkNode* LinkReverseInner(LinkNode* pNode)
{
if (pNode->pNext)
LinkReverseInner(pNode->pNext)->pNext = pNode;//令後一個節點的指針指向前一個節點
else
pLast = pNode;//找到最後一個節點
return pNode;
};
LinkNode* LinkReverse(LinkNode* pNode)
{
pLast = NULL;
if(pNode){
LinkReverseInner(pNode)->pNext = NULL;//遞歸結束,將最初的節點(現在是最後一個節點)的next指針設置為NULL
}
return pLast;//返回原最後一個節點反轉完成
}
void Traverse(LinkNode *pNode) {
while (pNode){
cout << pNode->data << endl;
pNode = pNode->pNext;
}
}
int main(){
LinkNode *theLink = NULL;
for (int i = 0; i < 4; i++)
{
LinkNode *p = new LinkNode();
p->data = i;
p->pNext = theLink;
theLink = p;
}
Traverse(theLink);
LinkNode* theLinkReverse = LinkReverse(theLink);
Traverse(theLinkReverse);
return 0;
}
//你在reverse和reverseinner兩個函數我加註釋的地方設置斷點,然後調試運行程序看一下就明白了.
④ c語言,鏈表的反轉,請寫出代碼,並講解下,謝了!!!!!
扣著的是頭節點(頭子)
車是首節點(首子)
馬是次節點(次子)
牙簽細的是指針指向,香頭發黑的是指向,鐵頭細的是指向。
根據步驟寫程序的偽演算法(3步4循環,7張圖片搞定),如下:
第一個循環把馬弄到車前面,
第二個循環把相弄到馬前面
第三個循環把士弄到相前面
........
直到香指向為空後停止循環。
代碼如下:只需要一個首結點pHead,就能把鏈表找到,並倒置。具體代碼如下
p香=pHead->pNext;
p鐵=p香->pNext;
p香->pNext=NULL;
P香=p鐵
while(p香 !=NULL)
{
p鐵=p香->pNext;
p香->pNext=pHead->pNext;
pHead->pNext=p香;
p香=p鐵;
}
對照偽演算法(三步四循環),和上面的代碼是一一對應的:
第一步:香頭指向首子,鐵頭指向次子
第二步:刪掉首子指向次子(鐵頭所指向的那個子)的牙簽
第三步:香頭跟著鐵頭
以下循環條件:(條件:香頭指向不為空)
{
循環1:鐵頭移動到香頭的下一個指向
循環2:香頭的下一個指向首子
循環3:頭子的下一個跟著香頭
循環4:香頭跟著鐵頭
}
自己用道具操作幾遍,然後把流程背會,以後自己根據流程寫代碼即可。
⑤ 如何鏈表反轉
鏈表反轉
單向鏈表的反轉是一個經常被問到的一個面試題,也是一個非常基礎的問題。比如一個鏈表是這樣的:
1->2->3->4->5
通過反轉後成為5->4->3->2->1。最容易想到的方法遍歷一遍鏈表,利用一個輔助指針,存儲遍歷過程中當前指針指向的下一個元素,然後將當前節點元素的指針反轉後,利用已經存儲的指針往後面繼續遍歷。源代碼如下:
struct
linka
{
int
data;
linka*
next;
};
void
reverse(linka*&
head)
{
if(head
==NULL)
return;
linka*pre,
*cur,
*ne;
pre=head;
cur=head->next;
while(cur)
{
ne
=
cur->next;
cur->next
=
pre;
pre
=
cur;
cur
=
ne;
}
head->next
=
NULL;
head
=
pre;
}
還有一種利用遞歸的方法。這種方法的基本思想是在反轉當前節點之前先調用遞歸函數反轉後續節點。源代碼如下。不過這個方法有一個缺點,就是在反轉後的最後一個結點會形成一個環,所以必須將函數的返回的節點的next域置為NULL。因為要改變head指針,所以我用了引用。演算法的源代碼如下:
linka*
reverse(linka*
p,linka*&
head)
{
if(p
==
NULL
||
p->next
==
NULL)
{
head=p;
return
p;
}
else
{
linka*
tmp
=
reverse(p->next,head);
tmp->next
=
p;
return
p;
}
}
⑥ LeetCode 第25題: k個一組翻轉鏈表
首先需要一個反轉鏈表函數,然後在此基礎上遞歸。
需要注意的是,我們是按照 k 去反轉,可以使用遞歸的方法來做,非遞歸遍歷也行。非遞歸可以參照使用反轉鏈表 m 到 n 之間的數的函數,然後稍加改造。
對於這類題目,最重要的還是用非遞歸最符合直覺的方法來做。但是非遞歸就涉及到一個細節問題,就可能就寫岔了。所以最重要的要素是把鏈表反轉的頭插法先寫好,然後從 mmy 出發開始 k 個,然後將鏈表斷開就很好反轉了,斷開之前記得先記錄下個頭。斷開之後,p 指向 head 的節點,反轉後它就變成尾節點。後面不寫了,反轉記住就這樣做。
非遞歸:
遞歸:
⑦ 鏈表的倒序
回樓主:你們做確實是不可以的哦
我寫了一個函數,代碼如下,主要是利用三個指針來變換~
希望你能明白哦 :)
struct student *reverse(struct student *head)
{
if (head->next == NULL)
return head;
struct student *p = head;
struct student *q = p->next;
struct student *r = q->next;
p->next = NULL;
while (r != NULL)
{
q->next = p;
p = q;
q = r;
r = r->next;
}
q->next = p;
return q;
}
⑧ 互聯網企業校招測試崗的面試經歷
1.58一面
(1)堆和棧的區別
(2)數組和鏈表的區別
(3)寫代碼,鏈表反轉和冒泡,快排的復雜度分析
(4)給你一個網路的網頁你怎麼測試
總結:說實話,因為58,網易,美團在同一天,大早上去面58,狀態極差,加上樓主本身挺水的,答的讓面試官覺得在背書吧,所以建議大家先思考下再回答,不要一上來就背書,面試官問的很細很基礎,建議投測試崗的同學,鏈表反轉,快排,冒泡等這些很常見的代碼一定要閉著眼睛就能寫出來,建議面試不要到的太早也不要到的太晚,最好是在面試前能夠稍微坐著休息下,順便看看自己的筆記或者王道啥的,讓自己的思維活躍起來。
2.網易三面
網易的面試官人都很好,不會的都會幫你回答,幫你糾正你回答的哪裡不對之類之類的。
一面:寫99乘法表,然後資料庫里的循環鏈表,簡單的SQL語句的查找刪除,堆和棧的區別,你為什麼想做測試,你怎麼評價里項目組的成員,你對他們印象最深的是什麼
二面:http的什麼什麼,忘了,寫簡單的SQL刪除查找語句,寫代碼給定一個已排好的序的數組和一個M,輸出數組中所有兩個相加等於M的元素對
三面:HR面,正常地聊天,問為什麼想來網易,你是怎麼平衡工作和項目的,你家是哪兒的,為什麼想來杭州,你期望薪資多少,你覺得自己是什麼樣的人之類之類的。
總結:網易面試我自己覺得有點不可思議,讓回來等通知,希望有好的結果吧~
3.美團
面完網易已經是下午5點了,本來美團預約是4點半,因為要把網易面完,到的`時候五點半了,工作人員有點不滿意,我最後一個面試的,面試官面到最後也沒耐心了,我也沒啥耐心了。
主要是摳項目,你的項目是怎麼做的,怎麼實現的,你寫一個你項目中的類吧,你為什麼想做測試?你覺得你為什麼適合做測試?你是怎麼測試你的項目的?你對測試有哪些了解?然後還拿出了筆試的題目,問我最後一道編程題當時沒調出來是為什麼?後來知道怎麼做了沒?
總結:面試心態一定要好,項目一定要挖的恨透,一定要正確地引導面試官。
4.京東兩面
一面:
(1)介紹項目,讓寫項目里的一個類
(2)寫代碼:找出一個字元串中字元連續相同的最長子串,如aabbccc,結果就是ccc
(3)在瀏覽器中輸入www.jingdong.com「」,域名解析過程
(4)七層網路模型中,你對哪層最了解?了解哪些協議?做過web開發?
(5)為什麼想做測試?
(6)引用和指針的區別,哪個更穩定,指針前面加const能和引用的作用一樣嗎?
(7)說一件最能證明你學習能力的事情?python會不會寫?你覺得python和c++哪個好學?
(8)怎麼測試微信紅包功能,說說你的思路吧
一面面試官人很好,我覺得我答的不好,但是面試官還是讓我過了,很感謝一面面試官~
二面:
純聊天,一點技術都沒問,但是不幸地是我剛剛查狀態已更新為復式沒通過~面試官人也很好,很有耐心~
5.華為
一面:主要是介紹自己的項目,因為我做的是圖像處理相關的,十分鍾左右,面試官說,雖然你做的很基礎,但是還是讓你過吧。
二面:綜合面,就問的比較多吧,先又問了一遍技術,然後問你怎麼體現你的抗壓能力?你覺得你自己是什麼樣的人?等等不記得了,就是各種問吧。
⑨ 鏈表反轉問題
2.寫一個演算法,藉助棧將一個帶頭結點的單鏈表倒置。
要求:利用棧的特徵,先沿著鏈表從頭至尾掃描一遍,將鏈表的每個結點的data域的值依次進棧,然後再沿著鏈表從頭至尾掃描一遍,同時棧中元素依次出棧,並填入到鏈表的每個結點的data域中。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100;
#define STACKINCREMENT 10;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
typedef int ElemType;
typedef struct link
{
int data;
struct link *next;
}NODE;
NODE *creast(int n)
{
NODE *head,*q,*p;
int i=1;
head=(NODE*)malloc(sizeof(NODE));
if(head)
{
printf("input the %dth number:",i);
scanf("%d",&head->data);
head->next=NULL;
p=head;
}
else
exit(0);
while(i<n)
{
q=(NODE*)malloc(sizeof(NODE));
q->next=NULL;
printf("input the %dth number:",++i);
scanf("%d",&q->data);
p->next=q;
p=q;
}
return head;
}
void output(NODE *head)
{
NODE *p;
p=head;
do
{
printf("%d",p->data);
p=p->next;
}while(p&&printf("-->"));
printf("\n");
}
int InitStack(SqStack &S)
{
int size = STACK_INIT_SIZE;
S.base=(int *)malloc(size*sizeof(ElemType));
if(!S.base)
return 0;
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return 1;
}
int Push(SqStack &S, int e)
{ if(S.top-S.base>=S.stacksize)
{
int stackinvrement = STACKINCREMENT;
S.base=(ElemType *) realloc(S.base,(S.stacksize+stackinvrement)*sizeof(ElemType));
if(!S.base)
return 0;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
int OutputStack(SqStack &S)
{
return *--S.top;
}
void main()
{
int n,i;
SqStack s;
NODE *head,*p;
InitStack(s);
printf("請輸入要進棧的元素個數是:");
scanf("%d",&n);
p=head=creast(n);
output(head);
for(i=1;i<=n;i++)
{
Push(s,p->data);
p=p->next;
}
p=head;
for(i=1;i<=n;i++)
{
p->data=OutputStack(s);
p=p->next;
}
output(head);
}
⑩ 鏈表 linkList如何實現反轉
struct List
{
int data;
List* next;
};
List* ReverseList(List* oldList,List* newHead=NULL)
{
List* next=oldList->next;
oldList->next=newHead;
newHead=oldList;
return (next==NULL) ? newHead : ReverseList(next,newHead);
}