java单向链表反序怎样实现
struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} };ListNode* reverse_list(ListNode *head){\tif (NULL == head || NULL == head-\u0026gt;next)\t\treturn head; ListNode *p = head;\tListNode *q = p-\u0026gt;next;\tListNode *r;\tp-\u0026gt;next = NULL;\twhile (q != NULL)\t{\t\tr = q-\u0026gt;next;\t\tq-\u0026gt;next = p;\t\tp = q;\t\tq = r;\t}\treturn p;}
java没玩过,有个c++的。单链表原地反转,应该差不多。。一个意思?。。
■网友static void switchNode(Node prev, Node curr) { Node next = curr.next; if (next == null) { // 没有下个节点的为链表最后节点, 结束交换 curr.next = prev; return; } if (prev == null) { // 没有上个节点的curr为根节点 curr.next = null; // 交换之后的根节点为最后一个节点, 它没有下个节点 } else { curr.next = prev; // 将下个结点指向上个节点 } switchNode(curr, next);}
这个比较浅显易懂吧,还有注释哦!
■网友
反转单向链表public ListNode reverse(ListNode head){ ListNode pre=null; while(head!=null){ ListNode next=head.next;//记录保留当前结点的下一个结点的地址 head.next=pre;//当前结点指针域(原为下一个结点的地址)改为上一个节点的地址 pre=head;//上一个结点变为当前结点,为之后的循环做准备 head=next;//当前结点变为下一个结点,为之后的循环做准备 } return pre; }
■网友
■网友
借这一题Reversed linked list II的答案代码来记个笔记,网上很多讲解中的next引来引去弄的我有点烦躁,画图会好理解一些。
核心部分的代码 for(int i=0; i\u0026lt;n-m; i++) { start.next = then.next; then.next = pre.next; pre.next = then; then = start.next; }
给定1 -\u0026gt; 2 -\u0026gt; 3 -\u0026gt; 4 -\u0026gt; 5,需要反转2 -\u0026gt; 3 -\u0026gt; 4的部分。
根据上面代码的逻辑,先是 2 -\u0026gt; 3部分需要反转
prev = 1, start = 2, then = 3, then.next = 4,经过上面的一步后现在是 1 -\u0026gt; 3 -\u0026gt; 2 -\u0026gt; 4 -\u0026gt; 5,继续反转,写出这个算法的人好牛逼啊,不看答案我是永远想不出来的,看了答案不复习两个礼拜后肯定会忘掉,刷算法题这件事情,就是在和自己的迟钝博斗啊,无奈对手有点强大。。
【java单向链表反序怎样实现】 上面的算法中prev一直没变过,prev.next和start之间的链也没断过,这里面是不是有更深的概念,有没有大神能来缕缕里面的道道?
■网友
最好看的应该是递归了吧,我看楼上是c++的,我上个javaListNode reverse(ListNode cur){ if(cur.next == null)return cur; reverse(cur.next).next = cur; cur.next = null; return cur;}cur是你想开始逆序的第一个结点,处女答哦
推荐阅读
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- Java工程师和C++工程师在工作上有啥区别哪个更适合自身发展
- 27岁,转行java的血与泪,该何去何从
- 怎样统计工程中未使用的java类
- 新互联网网站用Java还靠谱么对比Php,Python,Ruby的话
- 我想学java和安卓软件开发?
- 学计算机专业,java那些和网站开发选台式还是笔记本好
- JAVA设计思路
- 本人大专毕业一年,想要去培训,定了JAVAEE和安卓两个方向,应该学那个纠结,求帮助
- 从未接触过软件测试和java,可以学习主要是自学这两种其一吗