当前位置:网站首页 > 区块链基础 > 正文

单向链表反转是一种常见的链表操作(4种算法,实现单链表的反转!)



这篇文章主要介绍了Java常见数据结构面试题,带有答案及解释,希望对广大的程序爱好者有所帮助,同时祝大家面试有一个好结果,需要的朋友可以参考下哦!


java数据结构例题 java数据结构题库及答案_数据

笔试环节中的填空题其实就是在考你的基础啦!毕竟这一试就可以刷掉一批基础不扎实的人,所以不要小瞧基础的理论知识,它往往是你成功的一个关键点。


java数据结构例题 java数据结构题库及答案_数据_02

选择题是由基础题来的,基础好基本是都没什么太大问题的,但这些也是好的公司笔试环节必不可少的,所以有需要的朋友可以看看说不定什么时候就遇上了呢!


java数据结构例题 java数据结构题库及答案_存储结构_03

接下来的是大家都不太想看的代码题哦!也考虑到代码题比较难看,并且不定性很大,所以就只选择了几个展示出来。


答:

最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:

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;

}

}

答:
这个问题首先想到的是一个O(nlogn)的算法。就是任意挑选一个数组,遍历这个数组的所有元素,遍历过程中,在另一个数组中对第一个数组中的每个元素进行binary search。用C++实现代码如下:

bool findcommon(int a[],int size1,int b[],int size2)

{

int i;

for(i=0;i

{

int start=0,end=size2-1,mid;

while(start<=end)

{

mid=(start+end)/2;

if(a[i]==b[mid])

return true;

end=mid-1;

else

start=mid+1;

}

}

return false;

}

后来发现有一个 O(n)算法。因为两个数组都是排好序的。所以只要一次遍历就行了。首先设两个下标,分别初始化为两个数组的起始地址,依次向前推进。推进的规则是比较两个数组中的数字,小的那个数组的下标向前推进一步,直到任何一个数组的下标到达数组末尾时,如果这时还没碰到相同的数字,说明数组中没有相同的数字。

bool findcommon2(int a[], int size1, int b[], int size2)

{

int i=0,j=0;

while(i

{

if(a[i]==b[j])

return true;

if(a[i]>b[j])

j++;

i++;

}

return false;

}

public class Something {

void doSomething () {

private String s = “”;

int l = s.length();

}

}

答: 错。局部变量前不能放置任何访问修饰符 (private,public,和protected)。final可以用来修饰局部变量
(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。

abstract class Name {

private String name;

public abstract boolean isStupidName(String name) {}

}

答: 错。abstract method必须以分号结尾,且不带花括号。

到此这篇单向链表反转是一种常见的链表操作(4种算法,实现单链表的反转!)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 单向链表的定义(单向链表所具备的特点是什么)2025-03-02 07:18:05
  • 跳转链接怎么防红包提醒(跳转红包怎么做)2025-03-02 07:18:05
  • 单双向链表原理(单链表双向链表循环链表)2025-03-02 07:18:05
  • b站如何在视频中加链接(b站怎么在视频里放链接)2025-03-02 07:18:05
  • 对于一个头指针为head的单向链表(对于一个头指针为l的单循环链表)2025-03-02 07:18:05
  • 跳转链接怎么制作ppt(跳转链接代码怎么写)2025-03-02 07:18:05
  • b站上的视频链接怎么打开(b站的链接怎么用)2025-03-02 07:18:05
  • 单向链表和双向链表图解(单双向链表原理)2025-03-02 07:18:05
  • a标签弹出一个新窗口什么意思(a标签在新窗口打开链接添加什么属性)2025-03-02 07:18:05
  • 跳转链接代码怎么写(跳转链接代码怎么写出来)2025-03-02 07:18:05
  • 全屏图片