【链表】
单链表的分解
LeetCode86
链接:
题目:
思路:
1️⃣ 先分开为两个新链表,然后再连成一个
2️⃣ 定义两个哑结点并分别对应两个游标,然后去遍历原始链表
- 如果小于设定值x就放到p1里面去
- 反之放p2
3️⃣ 遍历完后,把p2.next置空
4️⃣ 再把这两个链表相连,返回的是dummy1.next(因为要跳过一开始的哑结点)
代码:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} x
* @return {ListNode}
*/
var partition = function(head, x) {
// 用const定义dummy这个哑结点
const dummy1 = new ListNode(-1)
// 用let定义p这个游标
let p1 = dummy1
const dummy2 = new ListNode(-1)
let p2 = dummy2
while(head !== null) {
if(head.val < x) {
p1.next = head
p1 = p1.next
} else {
p2.next = head
p2 = p2.next
}
// head也自己往后移
head = head.next
}
// 链表最后一定要记得手动置空,不然这道题有些地方会节点成环
// eg:[1,4,3,2,5,2] 3 最后的p2是5,p2.next是有指向2的,就会出现环,所以链表最后都置一下空好了
p2.next = null
// 这里的连接要注意
p1.next = dummy2.next
// 最后返回的是dummy1.next,因为要跳过那个一开始的空节点
return dummy1.next
};
🌟 链表注意点:
1、用 const 定义 dummy 这个哑结点,用 let 定义 p 这个游标(dummy是标记开头的,p是会往后的)
2、链表最后一定要记得手动置空,不然这道题有些地方会节点成环p2.next = null
写在最后:
下课后赶了一下午和一晚上的期末大作业
回寝室已经凌晨了 还好进度还不错
一起加油吧!