【问题标题】:Linked List Pointers | what's that mean: next is reference and can be viewed as a link or pointer?链表指针 |这是什么意思:next 是引用,可以被视为链接或指针?
【发布时间】:2021-03-04 11:23:01
【问题描述】:

我的问题是关于链表和指针 我知道链表及其工作原理,但我的问题是:

我有这个例子奇偶链表:

// This is class node for create nodes
class Node {
    constructor(val, next) {
        this.val = val === undefined ? 0 : val;
        this.next = next === undefined ? null : next;
    }
}

// this is our function to return odd nodes followed bt even nodes 
// * return the index of node not the value so if node index is 1 and value is 2 
// thats mean odd node not even cuz we don't care about value
// consider that index start from 1 not from 0

const oddEvenLinkedList = function (head) {
    if (!head) return head;
    var odd = head
    var even = head.next 
    var evenHead = even 
    while (odd.next) {
        odd.next = even.next 
        odd = odd.next 
        even.next = odd.next 
        even = even.next 
    }
    odd.next = evenHead
    return head;  
};
// create our linked list
// Node takes two params Node(value, next_node)
const head = new Node(1, 
             new Node(2, 
             new Node(3, 
             new Node(4, 
             new Node(5, 
             new Node(6, 
             new Node(7)))))))

console.log(oddEvenLinkedList(head));

结果将是:

head = [1,3,5,2,4,6,7] // odd numbers followed by even nubmers

所以我的问题是: 当我们添加时这里发生了什么:

    var odd = head
    var even = head.next 
    var evenHead = even 

我知道odd var 现在将是:[1,2,3,4,5,6] 同时even 将是:[2,3,4,5,6,7]

问题是:oddeven 循环后将等于:

   odd = [7] 
   even = null

在最后一行添加:odd.next = evenHead 这意味着odd 将等于odd=[7,1,2,3,4,5,6,7] 但是当我返回odd 时会是这样的:odd=[1,3,5,2,4,6,7]

同时当我返回head 将等于odd 相同的结果: head=[1,3,5,2,4,6,7]

为什么odd var 会影响headeven var 会影响evenHead

希望你明白我的意思:

上面的解释不懂就简单总结一下

let head = [1,2,3,4,5] // linked list 1->2->3...etc
let x = main
let z = main

//for example when change x or z :
x.next = null
//or 
z.next = null // or whatever value

// any changes we do in z or x will affect the head, why?

class Node {
    constructor(val, next) {
        this.val = val === undefined ? 0 : val;
        this.next = next === undefined ? null : next;
    }
}

var oddEvenLinkedList = function (head) {
    if (!head) return head;
    var odd = head 
    var even = head.next 
    var evenHead = even 
    while (odd.next) {
        odd.next = even.next 
        odd = odd.next 
        even.next = odd.next 
        even = even.next 
    }
    odd.next = evenHead
    return head;  
};
const head = new Node(1, new Node(2, new Node(3, new Node(4, new Node(5, new Node(6, new Node(7)))))))

console.log(oddEvenLinkedList(head));

【问题讨论】:

    标签: javascript pointers linked-list javascript-objects


    【解决方案1】:

    odd.next = evenHead 这意味着 odd 将等于 odd=[7,1,2,3,4,5,6,7] 但是当我返回 odd 时是这样的:odd=[1,3,5,2,4,6,7]

    原因是循环重新连接了列表。在循环执行之前,从head开始的列表是:

     odd
    head         
      ↓
      1→2→3→4→5→6→7
        ↑
     evenHead
       even 
    

    但是循环重定向了所有那些“箭头”,所以循环之后,链接如下:

    head         odd
      ↓           ↓
      1→→→3→→→5→→→7
        2→→→4→→→6
        ↑       ↑
     evenHead  even
    

    当最后一次赋值执行完毕后,我们得到最终结果:

    head         odd
      ↓           ↓
      1→→→3→→→5→→→7→→→2→→→4→→→6
                      ↑       ↑
                   evenHead  even
    

    因此,如果您查看odd,您会发现以下列表序列:[7, 2, 4, 6]。如果目的是首先得到所有奇数值,然后得到所有偶数值,那么循环之后的语句应该改变如下:

    odd.next = evenHead
    return head;  
    

    到这里:

    even.next = head
    return evenHead;  
    

    它们会在状态如下时被执行(我重复一遍):

    head         odd
      ↓           ↓
      1→→→3→→→5→→→7
        2→→→4→→→6
        ↑       ↑
     evenHead  even
    

    但是通过这些最终陈述,我们得到:

                  head         odd
                    ↓           ↓
        2→→→4→→→6→→→1→→→3→→→5→→→7
        ↑       ↑
     evenHead  even
      
    

    ...然后evenHead 将被返回,因此序列将是 [2, 4, 6, 1, 3, 5, 7]。

    【讨论】:

    • 感谢您的回答和您的时间。但我还是有点困惑,为什么当我们分配odd.next = evenHead 时,结果将是:[1,3,5,7,...etc],我们知道odds 的值是循环后的最后一个节点,意思是[7]。我猜想:odd 节点应该从节点 7 开始,而不是从节点 1 因为循环中删除了所有其他节点 [1,3,5]
    • 对不起,我不明白你在说什么。当你说“结果将是[1,3,5,7,...] 时,这只是部分正确,因为这不是odd 所指的,而是head。这是一个重要的区别。 odd 仍将指向 7,但我们返回的不是 odd。我们返回head。我认为我在回答中添加的表述清楚地表明了oddhead 之间的区别
    • 看看我展示的第三张图,看看odd 指向的位置 (7):那是链条中间的某个地方。如果我们要返回odd,那么调用者只会“看到”[7,2,4,6]。但是我们返回head
    • 这是否澄清了您的问题?
    • 对这个答案还有更多的反馈吗?
    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2011-01-27
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多