一.概念理解
下面是牛客描述链表的代码
/*class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
首先,我们看到链表就和容易犯怵,其实我们可以可以简单的把链表理解成一个成这样,链表就是一个对象,他有两个属性val和next,他的next是另外一个对象,下面是一个简单的链表{-1,-2,-3}
{
"val": -1,
"next": {
"val": -2,
"next": {
"val": -3,
"next": null
}
}
}
}
我们可以把它看成三个链表对象的嵌套
a = {
val:-1,
next:b
}
b={
val:-2,
next:c
}
c= {
val:-3,
next:null
}
这样看起来就简单多了,没有那么复杂了。
二、例题
下面是牛客上一道简单题 -- 反转链表
描述
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0≤n≤1000
要求:空间复杂度 O(1) ,时间复杂度 O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
示例1
输入:
{1,2,3}
返回值:
{3,2,1}
示例2
输入:
{}
返回值:
{}
说明:
空链表则输出空
下面是我自己觉得比较简单并且比较好理解的方法
/*class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param head ListNode类
* @return ListNode类
*/
export function ReverseList(head: ListNode): ListNode {
// write code here
let newListNode: ListNode = null;
let curlistNode: ListNode = head;
while (curlistNode != null) {
newListNode = { val: curlistNode.val, next: newListNode };
// newListNode = new ListNode(curlistNode.val,newListNode)
curlistNode = curlistNode.next;
}
return newListNode;
}
※ 我注释掉的那行代码,我觉得是一样的效果,但是在牛客上运行时出错的,有兴趣的同学可以尝试下。