指针:

指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;

可以是空值,可以在任何时候被初始化。

指针的值在初始化后可以改变,即指向其它的存储单元。

sizeof 指针 得到的是指针本身的大小。

引用:

跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。

引用不可以为空,当被创建的时候,必须初始化。

引用在进行初始化后就不会再改变了。

sizeof 引用 得到的是所指向的对象的大小。

指针示例

int a=1;
int *p=&a;

定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。

引用示例

int a=1;
int &b=a;

定义了一个整形变量a和这个整形a的引用b。事实上a和b是同一个东西,在内存占有同一个存储单元。

BJFUOJ

以节点为引用传递参数,以引用的方式传递

遍历指针的实现方式是创建一个新节点,以拷贝当前遍历节点

void DeleteEqualValueNode(ListNode& L)
{
	//遍历指针 
	ListNode p;
	//越过头节点,从第一个节点开始遍历 
	p=L->next; 
	
	//双指针:删除操作需要一前一后两个指针 
	ListNode front,back;
	
    //遍历链表:遍历每一个元素,查找后续与之重复的节点,重复则删除。 
    while(p->next)
    {
    	//后指针指向当前遍历位置 
        back=p;
        //前指针指向当前遍历位置的前一个位置 
        front=back->next;
        //前面有节点时 
        while(front)
        {
        	//前后节点值相同,就删除前面的节点 
            if(front->val==p->val)///重复判断
            {
            	//从链表里删除节点 
                back->next=front->next;
                //从内存中删除节点,释放内存
                delete front; 
                //前指针指向后指针的前一位 
                front=back->next; 
            }
            //前后节点值不同,两个指针一同向前滑动一位,相当于一个滑动窗口,永远保持一前一后的相邻状态 
            else
            {
                back=front;
                front=front->next;
            }
        }
        //如果前面还有节点,就向前遍历 
        if(p->next)
        {
            p=p->next;
        }
    }
}

以节点类型的指针作为参数传递,传的是地址

遍历指针的实现方式是创建一个节点类型的指针,存放当前遍历节点的地址。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
ListNode* removeDuplicateNodes(ListNode* L)
{
	//遍历指针 
	ListNode* p;//=new ListNode();
	//头节点也存储有效值
	p=L; 
	
	//双指针:删除操作需要一前一后两个指针 
	ListNode* front;
    ListNode* back;
	
    //遍历链表:遍历每一个元素,查找后续与之重复的节点,重复则删除。 
    while(p&&p->next)
    {
    	//后指针指向当前遍历位置 
        back=p;
        //前指针指向当前遍历位置的前一个位置 
        front=back->next;
        //前面有节点时 
        while(front)
        {
        	//前后节点值相同,就删除前面的节点 
            if(front->val==p->val)///重复判断
            {
            	//从链表里删除节点 
                back->next=front->next;
                //从内存中删除节点,释放内存
                delete front; 
                //前指针指向后指针的前一位 
                front=back->next; 
            }
            //前后节点值不同,两个指针一同向前滑动一位,相当于一个滑动窗口,永远保持一前一后的相邻状态 
            else
            {
                back=front;
                front=front->next;
            }
        }
        //如果前面还有节点,就向前遍历 
        if(p->next)
        {
            p=p->next;
        }
    }
    return L;
}
};