链表反转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);
}