题目:反转链表
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
提示:
链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000
代码:
public ListNode reverseList(ListNode head) {
if(head==null){
return null;
}
ListNode last=head;
ListNode node=head.next;
ListNode temp;//辅助交换
while(node!=null){
temp=node;
node=node.next;
temp.next=head;
head=temp;
}
last.next=null;
return head;
}
结果:
题目2:
给你单链表的头指针 head
和两个整数 left
和 right
,其中 left <= right
。请你反转从位置 left
到位置 right
的链表节点,返回 反转后的链表 。
示例:
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1 输出:[5]
提示:
链表中节点数目为 n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
思路:
将反转部分从原链表上切割下来成为单独链表,就和的一个一样了将反转获得的链表在接到原来的地方就行
代码:
public ListNode reverseBetween(ListNode head, int left, int right) {
if (head.next == null || left == right){
return head;
}
ListNode xuni = new ListNode(-1); //虚拟头
xuni.next = head;
ListNode l = xuni; // 初始化指向第一部分末尾的指针
ListNode r = xuni; // 初始化指向待反转部分末尾的指针
while (left > 1) {
l = l.next;
--left;
}
while (right > 0) {
r = r.next;
--right;
}
ListNode newhead=l.next;
l.next=null;
ListNode restNode = r.next; //后半部分
r.next = null; // 断开
ListNode rnewhead = reverseList(newhead);
l.next = rnewhead;
ListNode cur = xuni.next; // 初始化遍历指针为头结点
while (cur.next != null) { // 将遍历指针移动到原链表的末尾节点
cur = cur.next;
}
cur.next = restNode; // 连接剩余部分
return xuni.next; // 返回反转后的链表头结点
}
public ListNode reverseList(ListNode head) {
if (head == null) {
return head;
}
ListNode last = head;
ListNode node = head.next;
ListNode temp;//辅助交换
while (node != null) {
temp = node;
node = node.next;
temp.next = head;
head = temp;
}
last.next = null;
return head;
}