【问题标题】:Difference in using * in Linked List in C++在 C++ 的链表中使用 * 的区别
【发布时间】:2020-09-01 14:50:21
【问题描述】:

(*current = *current->next)(current = current->next)有什么区别? 我的代码是:

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {

        ListNode* current = head;
        while(current!=NULL)
        {
            while (current->next!=NULL && current->val==current->next->val)
                *current = *current->next;
            current = current->next;
        }
        return head;
    }
};

【问题讨论】:

  • 你明白*p = *qp = q之间的区别吗?pq是指针?
  • current = current->next 是您想要的。另一个实际上是复制数据并覆盖东西——这不是你想要的。
  • 指针前的* 操作符取消对指针的引用,返回指针指向的位置的值。没有* 操作符,只会复制指针contents(不是指针指向的东西)。
  • *current = *current->next; 好像会导致内存泄漏。
  • 非常感谢您清除概念!

标签: c++ pointers linked-list singly-linked-list function-definition


【解决方案1】:

在此声明中

*current = *current->next;

指针current->next指向的ListNode类型的对象被赋值给指针current指向的相同类型的对象。

在此声明中

current = current->next;

指针current->next的值被赋值给指针current

对于函数本身,如果其目的是删除具有重复值的相邻节点,则至少应按以下方式定义。

ListNode * deleteDuplicates( ListNode *head ) 
{
    for ( ListNode *current = head; current != NULL; current = current->next )
    {
        while ( current->next != NULL && current->val == current->next->val )
        {
            ListNode *tmp = current->next;
            current->next = current->next->next;
            delete tmp;
        }
    }

    return head;
}

似乎该函数可以声明为静态成员函数,如

static ListNode * deleteDuplicates( ListNode *head )
{
    //...
} 

你应该使用空指针字面量nullptr,而不是空指针常量NULL

【讨论】:

    【解决方案2】:

    指针速成课

    这声明了一个指针变量:

    ListNode* current;
    

    这声明了一个 ListNode 变量:

    ListNode node;
    

    这会将指针设置为指向 node:

    current = &node;
    

    这个*操作符dereferencescurrent和下面两行意思完全一样:

    std::cout << *current << '\n';
    std::cout << node << '\n';
    

    所以当你写*current 时,current 指向的就是ListNode

    【讨论】:

      【解决方案3】:

      解引用运算符* 获取指针指向的值

      声明

      *current = *current->next;
      

      current-&gt;next 指向的对象分配给current 指向的对象。

      现在当你不使用解引用操作符时:

      current = current->next;
      

      您分配的是指针,而不是它们指向的对象。

      在这个赋值之后,你有两个指针都指向同一个对象。


      如果我们用笔和纸画出来可能更容易理解。使用矩形绘制一个对象,并适当地标记它。然后绘制另一个矩形并使用箭头将其连接到第一个矩形。

      第二个矩形指向第一个矩形,就像 C++ 中的指针一样。

      通过使用取消引用运算符*,您可以按照箭头到达第一个矩形。

      假设我们有对象node

      +------+ |节点 | +------+

      然后我们创建一个指向node的指针current

      +---------+ +------+ |当前 | --> |节点 | +---------+ +------+

      当您使用current 时,您将获得指针本身。当您使用*current 时,您会按照箭头方向获取node

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-15
        • 2015-12-09
        • 2015-04-04
        • 1970-01-01
        相关资源
        最近更新 更多