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; }
■网友
java单向链表反序怎样实现


■网友
借这一题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部分需要反转
java单向链表反序怎样实现

prev = 1, start = 2, then = 3, then.next = 4,经过上面的一步后现在是 1 -\u0026gt; 3 -\u0026gt; 2 -\u0026gt; 4 -\u0026gt; 5,继续反转,写出这个算法的人好牛逼啊,不看答案我是永远想不出来的,看了答案不复习两个礼拜后肯定会忘掉,刷算法题这件事情,就是在和自己的迟钝博斗啊,无奈对手有点强大。。
java单向链表反序怎样实现

【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是你想开始逆序的第一个结点,处女答哦


推荐阅读