今天说一下反转单链表的简单实例,展示的是核心代码部分,后端用。结合我查询的时候遇到的一些问题,给大家梳理一下。
最下面是在力扣做题时的代码,实现的是单链表反转,如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
首先我们明确一下单链表的在数据库里存储的结构,如下图:
链表结构要点:
-
头指针表明了链表的起点,可以唯一确定一个单链表。 头指针指向的是链表的第一个结点,其指针域储存的是第一个结点在内存中的位置。
-
头结点是单链表的第一个结点,若单链表有头结点,则头指针指向头结点,若单链表没有头结点,则头指针指向第一个结点。
-
一个单链表可以没有头结点,但是不能没有头指针。 头结点的数据域可以不储存任何数据。
单链表是链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。这组存储单元既可以是连续的,也可以是不连续的。
链表中的数据是以结点来表示的,每个结点的构成:data(数据元素的值) + next(指示后继元素存储位置),简单来说,现在已知有两个宝箱,你知道data就是存东西的第一个宝箱,next就是这个宝箱旁边的纸条,告诉你下一个宝箱在哪里。
关于单链表反转代码的过程,我找到一张很形象的图,方便我们理解:由@De梦提供
/*
public class ListNode
{
public int val; //定义数据域
public ListNode next; //定义指针域
public ListNode (int x) //
{
val = x;
}
//上面这块这个部分是定义的ListNode,因为c#没有指针,这个定义之后当指针用
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
// pre指针,指向反转后的节点
ListNode pre = null;
//头节点指针
ListNode cur = head;
//迭代
while(cur!=null){
//Cur_next 节点,永远指向当前节点cur的下一个节点
ListNode Cur_next = cur.next;
//反转的关键:当前的节点指向其前一个节点(注意这不是双向链表,没有前驱指针)
cur.next = pre;
//更新pre
pre = cur;
//更新当前节点指针
cur = Cur_next ;
}
//pre是反转之后的头节点
return pre;
}
}
有问题希望指出,谢谢各位。