首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反转单向链表[Java]

反转单向链表[Java]
EN

Stack Overflow用户
提问于 2018-05-07 07:35:24
回答 2查看 798关注 0票数 3

我想知道是否有人可以帮助解释如何在不创建新节点或更改现有节点中的数据的情况下反转单链表。我正在努力准备期末考试,我们在之前的一次考试中遇到了这个问题。他们不会发布测试代码部分的答案,我也没能弄清楚。

他们告诉我们逆转它的最好方法是使用“跑步者技术”,我相信我知道这是什么。他们将其描述为使用两个指针或计数器来遍历列表并收集信息,但我不确定如何使用它来反转单个点赞列表。我可以通过暴力破解代码来反转长度为2、3和4的列表,但我无法执行循环或递归操作。任何关于如何去做的代码或解释将不胜感激,谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-05-07 07:58:44

您可以从以下想法开始派生代码:一个接一个地从输入列表中弹出元素,并将它们推送到最初为空的结果列表中:

代码语言:javascript
复制
NODE reverse(NODE list) {
  NODE result = null;
  while (list != null) {
    NODE head = <pop the first node off list>
    <push head onto result>
  }
  return result;
}

结果将与输入相反。现在用Java代替缺失的部分

代码语言:javascript
复制
NODE reverse(NODE list) {
  NODE result = null;
  while (list != null) {
    // pop
    NODE head = list;
    list = list.next;
    // push
    head.next = result;
    result = head;
  }
  return result;
}

你就完事了..。

票数 2
EN

Stack Overflow用户

发布于 2018-05-07 08:33:58

这取决于列表的实现,但我会递归到最后,然后颠倒引用。

代码语言:javascript
复制
void Reverse(List pList) {
   Reverse(pList, null, pList.First); // initial call
}

void Reverse(List pList, Node pPrevious, Node pCurrent) {
   if (pCurrent != null)
      Reverse(pList, pCurrent, pCurrent.Next);   // advance to the end

   else { // once we get to the end, make the last element the first element
      pList.First = pPrevious;
      return;
   }

   pCurrent.Next = pPrevious; // reverse the references on all nodes
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50205458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档